/*
 Highcharts JS v5.0.14 (2017-07-28)

 (c) 2009-2016 Torstein Honsi

 License: www.highcharts.com/license
*/
(function(M, S) {
	"object" === typeof module && module.exports ? module.exports = M.document ? S(M) : S : M.Highcharts = S(M)
})("undefined" !== typeof window ? window : this, function(M) {
	M = function() {
		var a = window,
			C = a.document,
			A = a.navigator && a.navigator.userAgent || "",
			F = C && C.createElementNS && !!C.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGRect,
			E = /(edge|msie|trident)/i.test(A) && !window.opera,
			m = !F,
			f = /Firefox/.test(A),
			l = f && 4 > parseInt(A.split("Firefox/")[1], 10);
		return a.Highcharts ? a.Highcharts.error(16, !0) : {
			product: "Highcharts",
			version: "5.0.14",
			deg2rad: 2 * Math.PI / 360,
			doc: C,
			hasBidiBug: l,
			hasTouch: C && void 0 !== C.documentElement.ontouchstart,
			isMS: E,
			isWebKit: /AppleWebKit/.test(A),
			isFirefox: f,
			isTouchDevice: /(Mobile|Android|Windows Phone)/.test(A),
			SVG_NS: "http://www.w3.org/2000/svg",
			chartCount: 0,
			seriesTypes: {},
			symbolSizes: {},
			svg: F,
			vml: m,
			win: a,
			marginNames: ["plotTop", "marginRight", "marginBottom", "plotLeft"],
			noop: function() {},
			charts: []
		}
	}();
	(function(a) {
		var C = [],
			A = a.charts,
			F = a.doc,
			E = a.win;
		a.error = function(m, f) {
			m = a.isNumber(m) ? "Highcharts error #" +
				m + ": www.highcharts.com/errors/" + m : m;
			if(f) throw Error(m);
			E.console && console.log(m)
		};
		a.Fx = function(a, f, l) {
			this.options = f;
			this.elem = a;
			this.prop = l
		};
		a.Fx.prototype = {
			dSetter: function() {
				var a = this.paths[0],
					f = this.paths[1],
					l = [],
					r = this.now,
					u = a.length,
					t;
				if(1 === r) l = this.toD;
				else if(u === f.length && 1 > r)
					for(; u--;) t = parseFloat(a[u]), l[u] = isNaN(t) ? a[u] : r * parseFloat(f[u] - t) + t;
				else l = f;
				this.elem.attr("d", l, null, !0)
			},
			update: function() {
				var a = this.elem,
					f = this.prop,
					l = this.now,
					r = this.options.step;
				if(this[f + "Setter"]) this[f +
					"Setter"]();
				else a.attr ? a.element && a.attr(f, l, null, !0) : a.style[f] = l + this.unit;
				r && r.call(a, l, this)
			},
			run: function(a, f, l) {
				var r = this,
					m = function(a) {
						return m.stopped ? !1 : r.step(a)
					},
					t;
				this.startTime = +new Date;
				this.start = a;
				this.end = f;
				this.unit = l;
				this.now = this.start;
				this.pos = 0;
				m.elem = this.elem;
				m.prop = this.prop;
				m() && 1 === C.push(m) && (m.timerId = setInterval(function() {
					for(t = 0; t < C.length; t++) C[t]() || C.splice(t--, 1);
					C.length || clearInterval(m.timerId)
				}, 13))
			},
			step: function(m) {
				var f = +new Date,
					l, r = this.options,
					u = this.elem,
					t = r.complete,
					g = r.duration,
					d = r.curAnim;
				u.attr && !u.element ? m = !1 : m || f >= g + this.startTime ? (this.now = this.end, this.pos = 1, this.update(), l = d[this.prop] = !0, a.objectEach(d, function(a) {
					!0 !== a && (l = !1)
				}), l && t && t.call(u), m = !1) : (this.pos = r.easing((f - this.startTime) / g), this.now = this.start + (this.end - this.start) * this.pos, this.update(), m = !0);
				return m
			},
			initPath: function(m, f, l) {
				function r(a) {
					var c, e;
					for(n = a.length; n--;) c = "M" === a[n] || "L" === a[n], e = /[a-zA-Z]/.test(a[n + 3]), c && e && a.splice(n + 1, 0, a[n + 1], a[n + 2], a[n + 1], a[n + 2])
				}

				function u(a, c) {
					for(; a.length < v;) {
						a[0] = c[v - a.length];
						var b = a.slice(0, e);
						[].splice.apply(a, [0, 0].concat(b));
						D && (b = a.slice(a.length - e), [].splice.apply(a, [a.length, 0].concat(b)), n--)
					}
					a[0] = "M"
				}

				function t(a, c) {
					for(var q = (v - a.length) / e; 0 < q && q--;) y = a.slice().splice(a.length / J - e, e * J), y[0] = c[v - e - q * e], b && (y[e - 6] = y[e - 2], y[e - 5] = y[e - 1]), [].splice.apply(a, [a.length / J, 0].concat(y)), D && q--
				}
				f = f || "";
				var g, d = m.startX,
					k = m.endX,
					b = -1 < f.indexOf("C"),
					e = b ? 7 : 3,
					v, y, n;
				f = f.split(" ");
				l = l.slice();
				var D = m.isArea,
					J = D ? 2 : 1,
					c;
				b && (r(f),
					r(l));
				if(d && k) {
					for(n = 0; n < d.length; n++)
						if(d[n] === k[0]) {
							g = n;
							break
						} else if(d[0] === k[k.length - d.length + n]) {
						g = n;
						c = !0;
						break
					}
					void 0 === g && (f = [])
				}
				f.length && a.isNumber(g) && (v = l.length + g * J * e, c ? (u(f, l), t(l, f)) : (u(l, f), t(f, l)));
				return [f, l]
			}
		};
		a.Fx.prototype.fillSetter = a.Fx.prototype.strokeSetter = function() {
			this.elem.attr(this.prop, a.color(this.start).tweenTo(a.color(this.end), this.pos), null, !0)
		};
		a.extend = function(a, f) {
			var m;
			a || (a = {});
			for(m in f) a[m] = f[m];
			return a
		};
		a.merge = function() {
			var m, f = arguments,
				l, r = {},
				u =
				function(f, g) {
					"object" !== typeof f && (f = {});
					a.objectEach(g, function(d, k) {
						!a.isObject(d, !0) || a.isClass(d) || a.isDOMElement(d) ? f[k] = g[k] : f[k] = u(f[k] || {}, d)
					});
					return f
				};
			!0 === f[0] && (r = f[1], f = Array.prototype.slice.call(f, 2));
			l = f.length;
			for(m = 0; m < l; m++) r = u(r, f[m]);
			return r
		};
		a.pInt = function(a, f) {
			return parseInt(a, f || 10)
		};
		a.isString = function(a) {
			return "string" === typeof a
		};
		a.isArray = function(a) {
			a = Object.prototype.toString.call(a);
			return "[object Array]" === a || "[object Array Iterator]" === a
		};
		a.isObject = function(m,
			f) {
			return !!m && "object" === typeof m && (!f || !a.isArray(m))
		};
		a.isDOMElement = function(m) {
			return a.isObject(m) && "number" === typeof m.nodeType
		};
		a.isClass = function(m) {
			var f = m && m.constructor;
			return !(!a.isObject(m, !0) || a.isDOMElement(m) || !f || !f.name || "Object" === f.name)
		};
		a.isNumber = function(a) {
			return "number" === typeof a && !isNaN(a)
		};
		a.erase = function(a, f) {
			for(var m = a.length; m--;)
				if(a[m] === f) {
					a.splice(m, 1);
					break
				}
		};
		a.defined = function(a) {
			return void 0 !== a && null !== a
		};
		a.attr = function(m, f, l) {
			var r;
			a.isString(f) ? a.defined(l) ?
				m.setAttribute(f, l) : m && m.getAttribute && (r = m.getAttribute(f)) : a.defined(f) && a.isObject(f) && a.objectEach(f, function(a, f) {
					m.setAttribute(f, a)
				});
			return r
		};
		a.splat = function(m) {
			return a.isArray(m) ? m : [m]
		};
		a.syncTimeout = function(a, f, l) {
			if(f) return setTimeout(a, f, l);
			a.call(0, l)
		};
		a.pick = function() {
			var a = arguments,
				f, l, r = a.length;
			for(f = 0; f < r; f++)
				if(l = a[f], void 0 !== l && null !== l) return l
		};
		a.css = function(m, f) {
			a.isMS && !a.svg && f && void 0 !== f.opacity && (f.filter = "alpha(opacity\x3d" + 100 * f.opacity + ")");
			a.extend(m.style,
				f)
		};
		a.createElement = function(m, f, l, r, u) {
			m = F.createElement(m);
			var t = a.css;
			f && a.extend(m, f);
			u && t(m, {
				padding: 0,
				border: "none",
				margin: 0
			});
			l && t(m, l);
			r && r.appendChild(m);
			return m
		};
		a.extendClass = function(m, f) {
			var l = function() {};
			l.prototype = new m;
			a.extend(l.prototype, f);
			return l
		};
		a.pad = function(a, f, l) {
			return Array((f || 2) + 1 - String(a).length).join(l || 0) + a
		};
		a.relativeLength = function(a, f, l) {
			return /%$/.test(a) ? f * parseFloat(a) / 100 + (l || 0) : parseFloat(a)
		};
		a.wrap = function(a, f, l) {
			var r = a[f];
			a[f] = function() {
				var a = Array.prototype.slice.call(arguments),
					f = arguments,
					g = this;
				g.proceed = function() {
					r.apply(g, arguments.length ? arguments : f)
				};
				a.unshift(r);
				a = l.apply(this, a);
				g.proceed = null;
				return a
			}
		};
		a.getTZOffset = function(m) {
			var f = a.Date;
			return 6E4 * (f.hcGetTimezoneOffset && f.hcGetTimezoneOffset(m) || f.hcTimezoneOffset || 0)
		};
		a.dateFormat = function(m, f, l) {
			if(!a.defined(f) || isNaN(f)) return a.defaultOptions.lang.invalidDate || "";
			m = a.pick(m, "%Y-%m-%d %H:%M:%S");
			var r = a.Date,
				u = new r(f - a.getTZOffset(f)),
				t = u[r.hcGetHours](),
				g = u[r.hcGetDay](),
				d = u[r.hcGetDate](),
				k = u[r.hcGetMonth](),
				b = u[r.hcGetFullYear](),
				e = a.defaultOptions.lang,
				v = e.weekdays,
				y = e.shortWeekdays,
				n = a.pad,
				r = a.extend({
					a: y ? y[g] : v[g].substr(0, 3),
					A: v[g],
					d: n(d),
					e: n(d, 2, " "),
					w: g,
					b: e.shortMonths[k],
					B: e.months[k],
					m: n(k + 1),
					y: b.toString().substr(2, 2),
					Y: b,
					H: n(t),
					k: t,
					I: n(t % 12 || 12),
					l: t % 12 || 12,
					M: n(u[r.hcGetMinutes]()),
					p: 12 > t ? "AM" : "PM",
					P: 12 > t ? "am" : "pm",
					S: n(u.getSeconds()),
					L: n(Math.round(f % 1E3), 3)
				}, a.dateFormats);
			a.objectEach(r, function(a, e) {
				for(; - 1 !== m.indexOf("%" + e);) m = m.replace("%" + e, "function" === typeof a ? a(f) : a)
			});
			return l ? m.substr(0,
				1).toUpperCase() + m.substr(1) : m
		};
		a.formatSingle = function(m, f) {
			var l = /\.([0-9])/,
				r = a.defaultOptions.lang;
			/f$/.test(m) ? (l = (l = m.match(l)) ? l[1] : -1, null !== f && (f = a.numberFormat(f, l, r.decimalPoint, -1 < m.indexOf(",") ? r.thousandsSep : ""))) : f = a.dateFormat(m, f);
			return f
		};
		a.format = function(m, f) {
			for(var l = "{", r = !1, u, t, g, d, k = [], b; m;) {
				l = m.indexOf(l);
				if(-1 === l) break;
				u = m.slice(0, l);
				if(r) {
					u = u.split(":");
					t = u.shift().split(".");
					d = t.length;
					b = f;
					for(g = 0; g < d; g++) b = b[t[g]];
					u.length && (b = a.formatSingle(u.join(":"), b));
					k.push(b)
				} else k.push(u);
				m = m.slice(l + 1);
				l = (r = !r) ? "}" : "{"
			}
			k.push(m);
			return k.join("")
		};
		a.getMagnitude = function(a) {
			return Math.pow(10, Math.floor(Math.log(a) / Math.LN10))
		};
		a.normalizeTickInterval = function(m, f, l, r, u) {
			var t, g = m;
			l = a.pick(l, 1);
			t = m / l;
			f || (f = u ? [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] : [1, 2, 2.5, 5, 10], !1 === r && (1 === l ? f = a.grep(f, function(a) {
				return 0 === a % 1
			}) : .1 >= l && (f = [1 / l])));
			for(r = 0; r < f.length && !(g = f[r], u && g * l >= m || !u && t <= (f[r] + (f[r + 1] || f[r])) / 2); r++);
			return g = a.correctFloat(g * l, -Math.round(Math.log(.001) / Math.LN10))
		};
		a.stableSort =
			function(a, f) {
				var l = a.length,
					r, m;
				for(m = 0; m < l; m++) a[m].safeI = m;
				a.sort(function(a, g) {
					r = f(a, g);
					return 0 === r ? a.safeI - g.safeI : r
				});
				for(m = 0; m < l; m++) delete a[m].safeI
			};
		a.arrayMin = function(a) {
			for(var f = a.length, l = a[0]; f--;) a[f] < l && (l = a[f]);
			return l
		};
		a.arrayMax = function(a) {
			for(var f = a.length, l = a[0]; f--;) a[f] > l && (l = a[f]);
			return l
		};
		a.destroyObjectProperties = function(m, f) {
			a.objectEach(m, function(a, r) {
				a && a !== f && a.destroy && a.destroy();
				delete m[r]
			})
		};
		a.discardElement = function(m) {
			var f = a.garbageBin;
			f || (f = a.createElement("div"));
			m && f.appendChild(m);
			f.innerHTML = ""
		};
		a.correctFloat = function(a, f) {
			return parseFloat(a.toPrecision(f || 14))
		};
		a.setAnimation = function(m, f) {
			f.renderer.globalAnimation = a.pick(m, f.options.chart.animation, !0)
		};
		a.animObject = function(m) {
			return a.isObject(m) ? a.merge(m) : {
				duration: m ? 500 : 0
			}
		};
		a.timeUnits = {
			millisecond: 1,
			second: 1E3,
			minute: 6E4,
			hour: 36E5,
			day: 864E5,
			week: 6048E5,
			month: 24192E5,
			year: 314496E5
		};
		a.numberFormat = function(m, f, l, r) {
			m = +m || 0;
			f = +f;
			var u = a.defaultOptions.lang,
				t = (m.toString().split(".")[1] || "").split("e")[0].length,
				g, d, k = m.toString().split("e"); - 1 === f ? f = Math.min(t, 20) : a.isNumber(f) || (f = 2);
			d = (Math.abs(k[1] ? k[0] : m) + Math.pow(10, -Math.max(f, t) - 1)).toFixed(f);
			t = String(a.pInt(d));
			g = 3 < t.length ? t.length % 3 : 0;
			l = a.pick(l, u.decimalPoint);
			r = a.pick(r, u.thousandsSep);
			m = (0 > m ? "-" : "") + (g ? t.substr(0, g) + r : "");
			m += t.substr(g).replace(/(\d{3})(?=\d)/g, "$1" + r);
			f && (m += l + d.slice(-f));
			k[1] && (m += "e" + k[1]);
			return m
		};
		Math.easeInOutSine = function(a) {
			return -.5 * (Math.cos(Math.PI * a) - 1)
		};
		a.getStyle = function(m, f, l) {
			if("width" === f) return Math.min(m.offsetWidth,
				m.scrollWidth) - a.getStyle(m, "padding-left") - a.getStyle(m, "padding-right");
			if("height" === f) return Math.min(m.offsetHeight, m.scrollHeight) - a.getStyle(m, "padding-top") - a.getStyle(m, "padding-bottom");
			if(m = E.getComputedStyle(m, void 0)) m = m.getPropertyValue(f), a.pick(l, !0) && (m = a.pInt(m));
			return m
		};
		a.inArray = function(a, f) {
			return f.indexOf ? f.indexOf(a) : [].indexOf.call(f, a)
		};
		a.grep = function(a, f) {
			return [].filter.call(a, f)
		};
		a.find = function(a, f) {
			return [].find.call(a, f)
		};
		a.map = function(a, f) {
			for(var l = [], r = 0, m =
					a.length; r < m; r++) l[r] = f.call(a[r], a[r], r, a);
			return l
		};
		a.offset = function(a) {
			var f = F.documentElement;
			a = a.getBoundingClientRect();
			return {
				top: a.top + (E.pageYOffset || f.scrollTop) - (f.clientTop || 0),
				left: a.left + (E.pageXOffset || f.scrollLeft) - (f.clientLeft || 0)
			}
		};
		a.stop = function(a, f) {
			for(var l = C.length; l--;) C[l].elem !== a || f && f !== C[l].prop || (C[l].stopped = !0)
		};
		a.each = function(a, f, l) {
			return Array.prototype.forEach.call(a, f, l)
		};
		a.objectEach = function(a, f, l) {
			for(var r in a) a.hasOwnProperty(r) && f.call(l, a[r], r, a)
		};
		a.addEvent = function(m, f, l) {
			function r(a) {
				a.target = a.srcElement || E;
				l.call(m, a)
			}
			var u = m.hcEvents = m.hcEvents || {};
			m.addEventListener ? m.addEventListener(f, l, !1) : m.attachEvent && (m.hcEventsIE || (m.hcEventsIE = {}), l.hcGetKey || (l.hcGetKey = a.uniqueKey()), m.hcEventsIE[l.hcGetKey] = r, m.attachEvent("on" + f, r));
			u[f] || (u[f] = []);
			u[f].push(l);
			return function() {
				a.removeEvent(m, f, l)
			}
		};
		a.removeEvent = function(m, f, l) {
			function r(a, b) {
				m.removeEventListener ? m.removeEventListener(a, b, !1) : m.attachEvent && (b = m.hcEventsIE[b.hcGetKey],
					m.detachEvent("on" + a, b))
			}

			function u() {
				var d, b;
				m.nodeName && (f ? (d = {}, d[f] = !0) : d = g, a.objectEach(d, function(a, d) {
					if(g[d])
						for(b = g[d].length; b--;) r(d, g[d][b])
				}))
			}
			var t, g = m.hcEvents,
				d;
			g && (f ? (t = g[f] || [], l ? (d = a.inArray(l, t), -1 < d && (t.splice(d, 1), g[f] = t), r(f, l)) : (u(), g[f] = [])) : (u(), m.hcEvents = {}))
		};
		a.fireEvent = function(m, f, l, r) {
			var u;
			u = m.hcEvents;
			var t, g;
			l = l || {};
			if(F.createEvent && (m.dispatchEvent || m.fireEvent)) u = F.createEvent("Events"), u.initEvent(f, !0, !0), a.extend(u, l), m.dispatchEvent ? m.dispatchEvent(u) : m.fireEvent(f,
				u);
			else if(u)
				for(u = u[f] || [], t = u.length, l.target || a.extend(l, {
						preventDefault: function() {
							l.defaultPrevented = !0
						},
						target: m,
						type: f
					}), f = 0; f < t; f++)(g = u[f]) && !1 === g.call(m, l) && l.preventDefault();
			r && !l.defaultPrevented && r(l)
		};
		a.animate = function(m, f, l) {
			var r, u = "",
				t, g, d;
			a.isObject(l) || (d = arguments, l = {
				duration: d[2],
				easing: d[3],
				complete: d[4]
			});
			a.isNumber(l.duration) || (l.duration = 400);
			l.easing = "function" === typeof l.easing ? l.easing : Math[l.easing] || Math.easeInOutSine;
			l.curAnim = a.merge(f);
			a.objectEach(f, function(d,
				b) {
				a.stop(m, b);
				g = new a.Fx(m, l, b);
				t = null;
				"d" === b ? (g.paths = g.initPath(m, m.d, f.d), g.toD = f.d, r = 0, t = 1) : m.attr ? r = m.attr(b) : (r = parseFloat(a.getStyle(m, b)) || 0, "opacity" !== b && (u = "px"));
				t || (t = d);
				t && t.match && t.match("px") && (t = t.replace(/px/g, ""));
				g.run(r, t, u)
			})
		};
		a.seriesType = function(m, f, l, r, u) {
			var t = a.getOptions(),
				g = a.seriesTypes;
			t.plotOptions[m] = a.merge(t.plotOptions[f], l);
			g[m] = a.extendClass(g[f] || function() {}, r);
			g[m].prototype.type = m;
			u && (g[m].prototype.pointClass = a.extendClass(a.Point, u));
			return g[m]
		};
		a.uniqueKey =
			function() {
				var a = Math.random().toString(36).substring(2, 9),
					f = 0;
				return function() {
					return "highcharts-" + a + "-" + f++
				}
			}();
		E.jQuery && (E.jQuery.fn.highcharts = function() {
			var m = [].slice.call(arguments);
			if(this[0]) return m[0] ? (new(a[a.isString(m[0]) ? m.shift() : "Chart"])(this[0], m[0], m[1]), this) : A[a.attr(this[0], "data-highcharts-chart")]
		});
		F && !F.defaultView && (a.getStyle = function(m, f) {
			var l = {
				width: "clientWidth",
				height: "clientHeight"
			}[f];
			if(m.style[f]) return a.pInt(m.style[f]);
			"opacity" === f && (f = "filter");
			if(l) return m.style.zoom =
				1, Math.max(m[l] - 2 * a.getStyle(m, "padding"), 0);
			m = m.currentStyle[f.replace(/\-(\w)/g, function(a, f) {
				return f.toUpperCase()
			})];
			"filter" === f && (m = m.replace(/alpha\(opacity=([0-9]+)\)/, function(a, f) {
				return f / 100
			}));
			return "" === m ? 1 : a.pInt(m)
		});
		Array.prototype.forEach || (a.each = function(a, f, l) {
			for(var r = 0, m = a.length; r < m; r++)
				if(!1 === f.call(l, a[r], r, a)) return r
		});
		Array.prototype.indexOf || (a.inArray = function(a, f) {
			var l, r = 0;
			if(f)
				for(l = f.length; r < l; r++)
					if(f[r] === a) return r;
			return -1
		});
		Array.prototype.filter || (a.grep =
			function(a, f) {
				for(var l = [], r = 0, m = a.length; r < m; r++) f(a[r], r) && l.push(a[r]);
				return l
			});
		Array.prototype.find || (a.find = function(a, f) {
			var l, r = a.length;
			for(l = 0; l < r; l++)
				if(f(a[l], l)) return a[l]
		})
	})(M);
	(function(a) {
		var C = a.each,
			A = a.isNumber,
			F = a.map,
			E = a.merge,
			m = a.pInt;
		a.Color = function(f) {
			if(!(this instanceof a.Color)) return new a.Color(f);
			this.init(f)
		};
		a.Color.prototype = {
			parsers: [{
				regex: /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,
				parse: function(a) {
					return [m(a[1]),
						m(a[2]), m(a[3]), parseFloat(a[4], 10)
					]
				}
			}, {
				regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,
				parse: function(a) {
					return [m(a[1]), m(a[2]), m(a[3]), 1]
				}
			}],
			names: {
				none: "rgba(255,255,255,0)",
				white: "#ffffff",
				black: "#000000"
			},
			init: function(f) {
				var l, r, m, t;
				if((this.input = f = this.names[f && f.toLowerCase ? f.toLowerCase() : ""] || f) && f.stops) this.stops = F(f.stops, function(g) {
					return new a.Color(g[1])
				});
				else if(f && "#" === f.charAt() && (l = f.length, f = parseInt(f.substr(1), 16), 7 === l ? r = [(f & 16711680) >> 16, (f & 65280) >>
						8, f & 255, 1
					] : 4 === l && (r = [(f & 3840) >> 4 | (f & 3840) >> 8, (f & 240) >> 4 | f & 240, (f & 15) << 4 | f & 15, 1])), !r)
					for(m = this.parsers.length; m-- && !r;) t = this.parsers[m], (l = t.regex.exec(f)) && (r = t.parse(l));
				this.rgba = r || []
			},
			get: function(a) {
				var f = this.input,
					r = this.rgba,
					m;
				this.stops ? (m = E(f), m.stops = [].concat(m.stops), C(this.stops, function(f, g) {
					m.stops[g] = [m.stops[g][0], f.get(a)]
				})) : m = r && A(r[0]) ? "rgb" === a || !a && 1 === r[3] ? "rgb(" + r[0] + "," + r[1] + "," + r[2] + ")" : "a" === a ? r[3] : "rgba(" + r.join(",") + ")" : f;
				return m
			},
			brighten: function(a) {
				var f, r = this.rgba;
				if(this.stops) C(this.stops, function(f) {
					f.brighten(a)
				});
				else if(A(a) && 0 !== a)
					for(f = 0; 3 > f; f++) r[f] += m(255 * a), 0 > r[f] && (r[f] = 0), 255 < r[f] && (r[f] = 255);
				return this
			},
			setOpacity: function(a) {
				this.rgba[3] = a;
				return this
			},
			tweenTo: function(a, l) {
				var f, m;
				a.rgba.length ? (f = this.rgba, a = a.rgba, m = 1 !== a[3] || 1 !== f[3], a = (m ? "rgba(" : "rgb(") + Math.round(a[0] + (f[0] - a[0]) * (1 - l)) + "," + Math.round(a[1] + (f[1] - a[1]) * (1 - l)) + "," + Math.round(a[2] + (f[2] - a[2]) * (1 - l)) + (m ? "," + (a[3] + (f[3] - a[3]) * (1 - l)) : "") + ")") : a = a.input || "none";
				return a
			}
		};
		a.color =
			function(f) {
				return new a.Color(f)
			}
	})(M);
	(function(a) {
		var C, A, F = a.addEvent,
			E = a.animate,
			m = a.attr,
			f = a.charts,
			l = a.color,
			r = a.css,
			u = a.createElement,
			t = a.defined,
			g = a.deg2rad,
			d = a.destroyObjectProperties,
			k = a.doc,
			b = a.each,
			e = a.extend,
			v = a.erase,
			y = a.grep,
			n = a.hasTouch,
			D = a.inArray,
			J = a.isArray,
			c = a.isFirefox,
			G = a.isMS,
			q = a.isObject,
			B = a.isString,
			K = a.isWebKit,
			p = a.merge,
			z = a.noop,
			I = a.objectEach,
			L = a.pick,
			h = a.pInt,
			w = a.removeEvent,
			P = a.stop,
			H = a.svg,
			O = a.SVG_NS,
			Q = a.symbolSizes,
			R = a.win;
		C = a.SVGElement = function() {
			return this
		};
		e(C.prototype, {
			opacity: 1,
			SVG_NS: O,
			textProps: "direction fontSize fontWeight fontFamily fontStyle color lineHeight width textAlign textDecoration textOverflow textOutline".split(" "),
			init: function(a, h) {
				this.element = "span" === h ? u(h) : k.createElementNS(this.SVG_NS, h);
				this.renderer = a
			},
			animate: function(x, h, c) {
				h = a.animObject(L(h, this.renderer.globalAnimation, !0));
				0 !== h.duration ? (c && (h.complete = c), E(this, x, h)) : (this.attr(x, null, c), h.step && h.step.call(this));
				return this
			},
			colorGradient: function(x, h, c) {
				var w = this.renderer,
					e, q, N, d, n, g, k, H, G, v, z = [],
					f;
				x.radialGradient ? q = "radialGradient" : x.linearGradient && (q = "linearGradient");
				q && (N = x[q], n = w.gradients, k = x.stops, v = c.radialReference, J(N) && (x[q] = N = {
					x1: N[0],
					y1: N[1],
					x2: N[2],
					y2: N[3],
					gradientUnits: "userSpaceOnUse"
				}), "radialGradient" === q && v && !t(N.gradientUnits) && (d = N, N = p(N, w.getRadialAttr(v, d), {
					gradientUnits: "userSpaceOnUse"
				})), I(N, function(a, x) {
					"id" !== x && z.push(x, a)
				}), I(k, function(a) {
					z.push(a)
				}), z = z.join(","), n[z] ? v = n[z].attr("id") : (N.id = v = a.uniqueKey(), n[z] = g = w.createElement(q).attr(N).add(w.defs),
					g.radAttr = d, g.stops = [], b(k, function(x) {
						0 === x[1].indexOf("rgba") ? (e = a.color(x[1]), H = e.get("rgb"), G = e.get("a")) : (H = x[1], G = 1);
						x = w.createElement("stop").attr({
							offset: x[0],
							"stop-color": H,
							"stop-opacity": G
						}).add(g);
						g.stops.push(x)
					})), f = "url(" + w.url + "#" + v + ")", c.setAttribute(h, f), c.gradient = z, x.toString = function() {
					return f
				})
			},
			applyTextOutline: function(x) {
				var h = this.element,
					c, w, p, e, q; - 1 !== x.indexOf("contrast") && (x = x.replace(/contrast/g, this.renderer.getContrast(h.style.fill)));
				x = x.split(" ");
				w = x[x.length - 1];
				if((p = x[0]) && "none" !== p && a.svg) {
					this.fakeTS = !0;
					x = [].slice.call(h.getElementsByTagName("tspan"));
					this.ySetter = this.xSetter;
					p = p.replace(/(^[\d\.]+)(.*?)$/g, function(a, x, h) {
						return 2 * x + h
					});
					for(q = x.length; q--;) c = x[q], "highcharts-text-outline" === c.getAttribute("class") && v(x, h.removeChild(c));
					e = h.firstChild;
					b(x, function(a, x) {
						0 === x && (a.setAttribute("x", h.getAttribute("x")), x = h.getAttribute("y"), a.setAttribute("y", x || 0), null === x && h.setAttribute("y", 0));
						a = a.cloneNode(1);
						m(a, {
							"class": "highcharts-text-outline",
							fill: w,
							stroke: w,
							"stroke-width": p,
							"stroke-linejoin": "round"
						});
						h.insertBefore(a, e)
					})
				}
			},
			attr: function(a, h, c, w) {
				var x, p = this.element,
					e, q = this,
					b, N;
				"string" === typeof a && void 0 !== h && (x = a, a = {}, a[x] = h);
				"string" === typeof a ? q = (this[a + "Getter"] || this._defaultGetter).call(this, a, p) : (I(a, function(x, h) {
					b = !1;
					w || P(this, h);
					this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/.test(h) && (e || (this.symbolAttr(a), e = !0), b = !0);
					!this.rotation || "x" !== h && "y" !== h || (this.doTransform = !0);
					b || (N = this[h + "Setter"] ||
						this._defaultSetter, N.call(this, x, h, p), this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(h) && this.updateShadows(h, x, N))
				}, this), this.afterSetters());
				c && c();
				return q
			},
			afterSetters: function() {
				this.doTransform && (this.updateTransform(), this.doTransform = !1)
			},
			updateShadows: function(a, h, c) {
				for(var x = this.shadows, w = x.length; w--;) c.call(x[w], "height" === a ? Math.max(h - (x[w].cutHeight || 0), 0) : "d" === a ? this.d : h, a, x[w])
			},
			addClass: function(a, h) {
				var x = this.attr("class") || ""; - 1 === x.indexOf(a) &&
					(h || (a = (x + (x ? " " : "") + a).replace("  ", " ")), this.attr("class", a));
				return this
			},
			hasClass: function(a) {
				return -1 !== D(a, (this.attr("class") || "").split(" "))
			},
			removeClass: function(a) {
				return this.attr("class", (this.attr("class") || "").replace(a, ""))
			},
			symbolAttr: function(a) {
				var x = this;
				b("x y r start end width height innerR anchorX anchorY".split(" "), function(h) {
					x[h] = L(a[h], x[h])
				});
				x.attr({
					d: x.renderer.symbols[x.symbolName](x.x, x.y, x.width, x.height, x)
				})
			},
			clip: function(a) {
				return this.attr("clip-path", a ? "url(" +
					this.renderer.url + "#" + a.id + ")" : "none")
			},
			crisp: function(a, h) {
				var x = this,
					c = {},
					w;
				h = h || a.strokeWidth || 0;
				w = Math.round(h) % 2 / 2;
				a.x = Math.floor(a.x || x.x || 0) + w;
				a.y = Math.floor(a.y || x.y || 0) + w;
				a.width = Math.floor((a.width || x.width || 0) - 2 * w);
				a.height = Math.floor((a.height || x.height || 0) - 2 * w);
				t(a.strokeWidth) && (a.strokeWidth = h);
				I(a, function(a, h) {
					x[h] !== a && (x[h] = c[h] = a)
				});
				return c
			},
			css: function(a) {
				var x = this.styles,
					c = {},
					w = this.element,
					p, q = "",
					b, d = !x,
					n = ["textOutline", "textOverflow", "width"];
				a && a.color && (a.fill = a.color);
				x && I(a, function(a, h) {
					a !== x[h] && (c[h] = a, d = !0)
				});
				d && (x && (a = e(x, c)), p = this.textWidth = a && a.width && "auto" !== a.width && "text" === w.nodeName.toLowerCase() && h(a.width), this.styles = a, p && !H && this.renderer.forExport && delete a.width, G && !H ? r(this.element, a) : (b = function(a, x) {
					return "-" + x.toLowerCase()
				}, I(a, function(a, x) {
					-1 === D(x, n) && (q += x.replace(/([A-Z])/g, b) + ":" + a + ";")
				}), q && m(w, "style", q)), this.added && ("text" === this.element.nodeName && this.renderer.buildText(this), a && a.textOutline && this.applyTextOutline(a.textOutline)));
				return this
			},
			strokeWidth: function() {
				return this["stroke-width"] || 0
			},
			on: function(a, h) {
				var x = this,
					c = x.element;
				n && "click" === a ? (c.ontouchstart = function(a) {
					x.touchEventFired = Date.now();
					a.preventDefault();
					h.call(c, a)
				}, c.onclick = function(a) {
					(-1 === R.navigator.userAgent.indexOf("Android") || 1100 < Date.now() - (x.touchEventFired || 0)) && h.call(c, a)
				}) : c["on" + a] = h;
				return this
			},
			setRadialReference: function(a) {
				var x = this.renderer.gradients[this.element.gradient];
				this.element.radialReference = a;
				x && x.radAttr && x.animate(this.renderer.getRadialAttr(a,
					x.radAttr));
				return this
			},
			translate: function(a, h) {
				return this.attr({
					translateX: a,
					translateY: h
				})
			},
			invert: function(a) {
				this.inverted = a;
				this.updateTransform();
				return this
			},
			updateTransform: function() {
				var a = this.translateX || 0,
					h = this.translateY || 0,
					c = this.scaleX,
					w = this.scaleY,
					p = this.inverted,
					e = this.rotation,
					q = this.element;
				p && (a += this.width, h += this.height);
				a = ["translate(" + a + "," + h + ")"];
				p ? a.push("rotate(90) scale(-1,1)") : e && a.push("rotate(" + e + " " + (q.getAttribute("x") || 0) + " " + (q.getAttribute("y") || 0) + ")");
				(t(c) ||
					t(w)) && a.push("scale(" + L(c, 1) + " " + L(w, 1) + ")");
				a.length && q.setAttribute("transform", a.join(" "))
			},
			toFront: function() {
				var a = this.element;
				a.parentNode.appendChild(a);
				return this
			},
			align: function(a, h, c) {
				var x, w, p, e, q = {};
				w = this.renderer;
				p = w.alignedObjects;
				var b, d;
				if(a) {
					if(this.alignOptions = a, this.alignByTranslate = h, !c || B(c)) this.alignTo = x = c || "renderer", v(p, this), p.push(this), c = null
				} else a = this.alignOptions, h = this.alignByTranslate, x = this.alignTo;
				c = L(c, w[x], w);
				x = a.align;
				w = a.verticalAlign;
				p = (c.x || 0) + (a.x ||
					0);
				e = (c.y || 0) + (a.y || 0);
				"right" === x ? b = 1 : "center" === x && (b = 2);
				b && (p += (c.width - (a.width || 0)) / b);
				q[h ? "translateX" : "x"] = Math.round(p);
				"bottom" === w ? d = 1 : "middle" === w && (d = 2);
				d && (e += (c.height - (a.height || 0)) / d);
				q[h ? "translateY" : "y"] = Math.round(e);
				this[this.placed ? "animate" : "attr"](q);
				this.placed = !0;
				this.alignAttr = q;
				return this
			},
			getBBox: function(a, h) {
				var x, c = this.renderer,
					w, p = this.element,
					q = this.styles,
					d, n = this.textStr,
					k, N = c.cache,
					H = c.cacheKeys,
					G;
				h = L(h, this.rotation);
				w = h * g;
				d = q && q.fontSize;
				void 0 !== n && (G = n.toString(), -1 === G.indexOf("\x3c") && (G = G.replace(/[0-9]/g, "0")), G += ["", h || 0, d, q && q.width, q && q.textOverflow].join());
				G && !a && (x = N[G]);
				if(!x) {
					if(p.namespaceURI === this.SVG_NS || c.forExport) {
						try {
							(k = this.fakeTS && function(a) {
								b(p.querySelectorAll(".highcharts-text-outline"), function(x) {
									x.style.display = a
								})
							}) && k("none"), x = p.getBBox ? e({}, p.getBBox()) : {
								width: p.offsetWidth,
								height: p.offsetHeight
							}, k && k("")
						} catch(W) {}
						if(!x || 0 > x.width) x = {
							width: 0,
							height: 0
						}
					} else x = this.htmlGetBBox();
					c.isSVG && (a = x.width, c = x.height, q && "11px" === q.fontSize &&
						17 === Math.round(c) && (x.height = c = 14), h && (x.width = Math.abs(c * Math.sin(w)) + Math.abs(a * Math.cos(w)), x.height = Math.abs(c * Math.cos(w)) + Math.abs(a * Math.sin(w))));
					if(G && 0 < x.height) {
						for(; 250 < H.length;) delete N[H.shift()];
						N[G] || H.push(G);
						N[G] = x
					}
				}
				return x
			},
			show: function(a) {
				return this.attr({
					visibility: a ? "inherit" : "visible"
				})
			},
			hide: function() {
				return this.attr({
					visibility: "hidden"
				})
			},
			fadeOut: function(a) {
				var x = this;
				x.animate({
					opacity: 0
				}, {
					duration: a || 150,
					complete: function() {
						x.attr({
							y: -9999
						})
					}
				})
			},
			add: function(a) {
				var x =
					this.renderer,
					h = this.element,
					c;
				a && (this.parentGroup = a);
				this.parentInverted = a && a.inverted;
				void 0 !== this.textStr && x.buildText(this);
				this.added = !0;
				if(!a || a.handleZ || this.zIndex) c = this.zIndexSetter();
				c || (a ? a.element : x.box).appendChild(h);
				if(this.onAdd) this.onAdd();
				return this
			},
			safeRemoveChild: function(a) {
				var x = a.parentNode;
				x && x.removeChild(a)
			},
			destroy: function() {
				var a = this,
					h = a.element || {},
					c = a.renderer.isSVG && "SPAN" === h.nodeName && a.parentGroup,
					w = h.ownerSVGElement;
				h.onclick = h.onmouseout = h.onmouseover = h.onmousemove =
					h.point = null;
				P(a);
				a.clipPath && w && (b(w.querySelectorAll("[clip-path]"), function(x) {
					-1 < x.getAttribute("clip-path").indexOf(a.clipPath.element.id + ")") && x.removeAttribute("clip-path")
				}), a.clipPath = a.clipPath.destroy());
				if(a.stops) {
					for(w = 0; w < a.stops.length; w++) a.stops[w] = a.stops[w].destroy();
					a.stops = null
				}
				a.safeRemoveChild(h);
				for(a.destroyShadows(); c && c.div && 0 === c.div.childNodes.length;) h = c.parentGroup, a.safeRemoveChild(c.div), delete c.div, c = h;
				a.alignTo && v(a.renderer.alignedObjects, a);
				I(a, function(x, h) {
					delete a[h]
				});
				return null
			},
			shadow: function(a, h, c) {
				var x = [],
					w, p, q = this.element,
					e, b, d, n;
				if(!a) this.destroyShadows();
				else if(!this.shadows) {
					b = L(a.width, 3);
					d = (a.opacity || .15) / b;
					n = this.parentInverted ? "(-1,-1)" : "(" + L(a.offsetX, 1) + ", " + L(a.offsetY, 1) + ")";
					for(w = 1; w <= b; w++) p = q.cloneNode(0), e = 2 * b + 1 - 2 * w, m(p, {
						isShadow: "true",
						stroke: a.color || "#000000",
						"stroke-opacity": d * w,
						"stroke-width": e,
						transform: "translate" + n,
						fill: "none"
					}), c && (m(p, "height", Math.max(m(p, "height") - e, 0)), p.cutHeight = e), h ? h.element.appendChild(p) : q.parentNode.insertBefore(p,
						q), x.push(p);
					this.shadows = x
				}
				return this
			},
			destroyShadows: function() {
				b(this.shadows || [], function(a) {
					this.safeRemoveChild(a)
				}, this);
				this.shadows = void 0
			},
			xGetter: function(a) {
				"circle" === this.element.nodeName && ("x" === a ? a = "cx" : "y" === a && (a = "cy"));
				return this._defaultGetter(a)
			},
			_defaultGetter: function(a) {
				a = L(this[a], this.element ? this.element.getAttribute(a) : null, 0);
				/^[\-0-9\.]+$/.test(a) && (a = parseFloat(a));
				return a
			},
			dSetter: function(a, h, c) {
				a && a.join && (a = a.join(" "));
				/(NaN| {2}|^$)/.test(a) && (a = "M 0 0");
				this[h] !==
					a && (c.setAttribute(h, a), this[h] = a)
			},
			dashstyleSetter: function(a) {
				var x, c = this["stroke-width"];
				"inherit" === c && (c = 1);
				if(a = a && a.toLowerCase()) {
					a = a.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");
					for(x = a.length; x--;) a[x] = h(a[x]) * c;
					a = a.join(",").replace(/NaN/g, "none");
					this.element.setAttribute("stroke-dasharray", a)
				}
			},
			alignSetter: function(a) {
				this.element.setAttribute("text-anchor", {
					left: "start",
					center: "middle",
					right: "end"
				}[a])
			},
			opacitySetter: function(a, h, c) {
				this[h] = a;
				c.setAttribute(h, a)
			},
			titleSetter: function(a) {
				var h = this.element.getElementsByTagName("title")[0];
				h || (h = k.createElementNS(this.SVG_NS, "title"), this.element.appendChild(h));
				h.firstChild && h.removeChild(h.firstChild);
				h.appendChild(k.createTextNode(String(L(a), "").replace(/<[^>]*>/g, "")))
			},
			textSetter: function(a) {
				a !== this.textStr && (delete this.bBox, this.textStr = a, this.added && this.renderer.buildText(this))
			},
			fillSetter: function(a,
				h, c) {
				"string" === typeof a ? c.setAttribute(h, a) : a && this.colorGradient(a, h, c)
			},
			visibilitySetter: function(a, h, c) {
				"inherit" === a ? c.removeAttribute(h) : this[h] !== a && c.setAttribute(h, a);
				this[h] = a
			},
			zIndexSetter: function(a, c) {
				var x = this.renderer,
					w = this.parentGroup,
					p = (w || x).element || x.box,
					q, e = this.element,
					b;
				q = this.added;
				var d;
				t(a) && (e.zIndex = a, a = +a, this[c] === a && (q = !1), this[c] = a);
				if(q) {
					(a = this.zIndex) && w && (w.handleZ = !0);
					c = p.childNodes;
					for(d = 0; d < c.length && !b; d++) w = c[d], q = w.zIndex, w !== e && (h(q) > a || !t(a) && t(q) || 0 >
						a && !t(q) && p !== x.box) && (p.insertBefore(e, w), b = !0);
					b || p.appendChild(e)
				}
				return b
			},
			_defaultSetter: function(a, h, c) {
				c.setAttribute(h, a)
			}
		});
		C.prototype.yGetter = C.prototype.xGetter;
		C.prototype.translateXSetter = C.prototype.translateYSetter = C.prototype.rotationSetter = C.prototype.verticalAlignSetter = C.prototype.scaleXSetter = C.prototype.scaleYSetter = function(a, h) {
			this[h] = a;
			this.doTransform = !0
		};
		C.prototype["stroke-widthSetter"] = C.prototype.strokeSetter = function(a, h, c) {
			this[h] = a;
			this.stroke && this["stroke-width"] ?
				(C.prototype.fillSetter.call(this, this.stroke, "stroke", c), c.setAttribute("stroke-width", this["stroke-width"]), this.hasStroke = !0) : "stroke-width" === h && 0 === a && this.hasStroke && (c.removeAttribute("stroke"), this.hasStroke = !1)
		};
		A = a.SVGRenderer = function() {
			this.init.apply(this, arguments)
		};
		e(A.prototype, {
			Element: C,
			SVG_NS: O,
			init: function(a, h, w, p, q, e) {
				var x;
				p = this.createElement("svg").attr({
					version: "1.1",
					"class": "highcharts-root"
				}).css(this.getStyle(p));
				x = p.element;
				a.appendChild(x); - 1 === a.innerHTML.indexOf("xmlns") &&
					m(x, "xmlns", this.SVG_NS);
				this.isSVG = !0;
				this.box = x;
				this.boxWrapper = p;
				this.alignedObjects = [];
				this.url = (c || K) && k.getElementsByTagName("base").length ? R.location.href.replace(/#.*?$/, "").replace(/<[^>]*>/g, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : "";
				this.createElement("desc").add().element.appendChild(k.createTextNode("Created with Highcharts 5.0.14"));
				this.defs = this.createElement("defs").add();
				this.allowHTML = e;
				this.forExport = q;
				this.gradients = {};
				this.cache = {};
				this.cacheKeys = [];
				this.imgCount =
					0;
				this.setSize(h, w, !1);
				var b;
				c && a.getBoundingClientRect && (h = function() {
					r(a, {
						left: 0,
						top: 0
					});
					b = a.getBoundingClientRect();
					r(a, {
						left: Math.ceil(b.left) - b.left + "px",
						top: Math.ceil(b.top) - b.top + "px"
					})
				}, h(), this.unSubPixelFix = F(R, "resize", h))
			},
			getStyle: function(a) {
				return this.style = e({
					fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',
					fontSize: "12px"
				}, a)
			},
			setStyle: function(a) {
				this.boxWrapper.css(this.getStyle(a))
			},
			isHidden: function() {
				return !this.boxWrapper.getBBox().width
			},
			destroy: function() {
				var a =
					this.defs;
				this.box = null;
				this.boxWrapper = this.boxWrapper.destroy();
				d(this.gradients || {});
				this.gradients = null;
				a && (this.defs = a.destroy());
				this.unSubPixelFix && this.unSubPixelFix();
				return this.alignedObjects = null
			},
			createElement: function(a) {
				var h = new this.Element;
				h.init(this, a);
				return h
			},
			draw: z,
			getRadialAttr: function(a, h) {
				return {
					cx: a[0] - a[2] / 2 + h.cx * a[2],
					cy: a[1] - a[2] / 2 + h.cy * a[2],
					r: h.r * a[2]
				}
			},
			getSpanWidth: function(a, h) {
				var c = a.getBBox(!0).width;
				!H && this.forExport && (c = this.measureSpanWidth(h.firstChild.data,
					a.styles));
				return c
			},
			applyEllipsis: function(a, h, c, w) {
				var x = a.rotation,
					p = c,
					q, e = 0,
					b = c.length,
					d = function(a) {
						h.removeChild(h.firstChild);
						a && h.appendChild(k.createTextNode(a))
					},
					n;
				a.rotation = 0;
				p = this.getSpanWidth(a, h);
				if(n = p > w) {
					for(; e <= b;) q = Math.ceil((e + b) / 2), p = c.substring(0, q) + "\u2026", d(p), p = this.getSpanWidth(a, h), e === b ? e = b + 1 : p > w ? b = q - 1 : e = q;
					0 === b && d("")
				}
				a.rotation = x;
				return n
			},
			buildText: function(a) {
				var c = a.element,
					w = this,
					x = w.forExport,
					p = L(a.textStr, "").toString(),
					q = -1 !== p.indexOf("\x3c"),
					e = c.childNodes,
					d, n, g, G, v = m(c, "x"),
					z = a.styles,
					f = a.textWidth,
					I = z && z.lineHeight,
					B = z && z.textOutline,
					D = z && "ellipsis" === z.textOverflow,
					l = z && "nowrap" === z.whiteSpace,
					P = z && z.fontSize,
					t, J, u = e.length,
					z = f && !a.added && this.box,
					K = function(a) {
						var x;
						x = /(px|em)$/.test(a && a.style.fontSize) ? a.style.fontSize : P || w.style.fontSize || 12;
						return I ? h(I) : w.fontMetrics(x, a.getAttribute("style") ? a : c).h
					};
				t = [p, D, l, I, B, P, f].join();
				if(t !== a.textCache) {
					for(a.textCache = t; u--;) c.removeChild(e[u]);
					q || B || D || f || -1 !== p.indexOf(" ") ? (d = /<.*class="([^"]+)".*>/,
						n = /<.*style="([^"]+)".*>/, g = /<.*href="([^"]+)".*>/, z && z.appendChild(c), p = q ? p.replace(/<(b|strong)>/g, '\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g, '\x3cspan style\x3d"font-style:italic"\x3e').replace(/<a/g, "\x3cspan").replace(/<\/(b|strong|i|em|a)>/g, "\x3c/span\x3e").split(/<br.*?>/g) : [p], p = y(p, function(a) {
							return "" !== a
						}), b(p, function(h, p) {
							var q, e = 0;
							h = h.replace(/^\s+|\s+$/g, "").replace(/<span/g, "|||\x3cspan").replace(/<\/span>/g, "\x3c/span\x3e|||");
							q = h.split("|||");
							b(q, function(h) {
								if("" !==
									h || 1 === q.length) {
									var b = {},
										z = k.createElementNS(w.SVG_NS, "tspan"),
										y, I;
									d.test(h) && (y = h.match(d)[1], m(z, "class", y));
									n.test(h) && (I = h.match(n)[1].replace(/(;| |^)color([ :])/, "$1fill$2"), m(z, "style", I));
									g.test(h) && !x && (m(z, "onclick", 'location.href\x3d"' + h.match(g)[1] + '"'), r(z, {
										cursor: "pointer"
									}));
									h = (h.replace(/<(.|\n)*?>/g, "") || " ").replace(/&lt;/g, "\x3c").replace(/&gt;/g, "\x3e");
									if(" " !== h) {
										z.appendChild(k.createTextNode(h));
										e ? b.dx = 0 : p && null !== v && (b.x = v);
										m(z, b);
										c.appendChild(z);
										!e && J && (!H && x && r(z, {
												display: "block"
											}),
											m(z, "dy", K(z)));
										if(f) {
											b = h.replace(/([^\^])-/g, "$1- ").split(" ");
											y = 1 < q.length || p || 1 < b.length && !l;
											var B = [],
												N, P = K(z),
												t = a.rotation;
											for(D && (G = w.applyEllipsis(a, z, h, f)); !D && y && (b.length || B.length);) a.rotation = 0, N = w.getSpanWidth(a, z), h = N > f, void 0 === G && (G = h), h && 1 !== b.length ? (z.removeChild(z.firstChild), B.unshift(b.pop())) : (b = B, B = [], b.length && !l && (z = k.createElementNS(O, "tspan"), m(z, {
												dy: P,
												x: v
											}), I && m(z, "style", I), c.appendChild(z)), N > f && (f = N)), b.length && z.appendChild(k.createTextNode(b.join(" ").replace(/- /g,
												"-")));
											a.rotation = t
										}
										e++
									}
								}
							});
							J = J || c.childNodes.length
						}), G && a.attr("title", a.textStr), z && z.removeChild(c), B && a.applyTextOutline && a.applyTextOutline(B)) : c.appendChild(k.createTextNode(p.replace(/&lt;/g, "\x3c").replace(/&gt;/g, "\x3e")))
				}
			},
			getContrast: function(a) {
				a = l(a).rgba;
				return 510 < a[0] + a[1] + a[2] ? "#000000" : "#FFFFFF"
			},
			button: function(a, h, c, w, q, b, d, n, g) {
				var x = this.label(a, h, c, g, null, null, null, null, "button"),
					k = 0;
				x.attr(p({
					padding: 8,
					r: 2
				}, q));
				var z, H, v, f;
				q = p({
					fill: "#f7f7f7",
					stroke: "#cccccc",
					"stroke-width": 1,
					style: {
						color: "#333333",
						cursor: "pointer",
						fontWeight: "normal"
					}
				}, q);
				z = q.style;
				delete q.style;
				b = p(q, {
					fill: "#e6e6e6"
				}, b);
				H = b.style;
				delete b.style;
				d = p(q, {
					fill: "#e6ebf5",
					style: {
						color: "#000000",
						fontWeight: "bold"
					}
				}, d);
				v = d.style;
				delete d.style;
				n = p(q, {
					style: {
						color: "#cccccc"
					}
				}, n);
				f = n.style;
				delete n.style;
				F(x.element, G ? "mouseover" : "mouseenter", function() {
					3 !== k && x.setState(1)
				});
				F(x.element, G ? "mouseout" : "mouseleave", function() {
					3 !== k && x.setState(k)
				});
				x.setState = function(a) {
					1 !== a && (x.state = k = a);
					x.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass("highcharts-button-" + ["normal", "hover", "pressed", "disabled"][a || 0]);
					x.attr([q, b, d, n][a || 0]).css([z, H, v, f][a || 0])
				};
				x.attr(q).css(e({
					cursor: "default"
				}, z));
				return x.on("click", function(a) {
					3 !== k && w.call(x, a)
				})
			},
			crispLine: function(a, h) {
				a[1] === a[4] && (a[1] = a[4] = Math.round(a[1]) - h % 2 / 2);
				a[2] === a[5] && (a[2] = a[5] = Math.round(a[2]) + h % 2 / 2);
				return a
			},
			path: function(a) {
				var h = {
					fill: "none"
				};
				J(a) ? h.d = a : q(a) && e(h, a);
				return this.createElement("path").attr(h)
			},
			circle: function(a, h, c) {
				a = q(a) ? a : {
					x: a,
					y: h,
					r: c
				};
				h = this.createElement("circle");
				h.xSetter =
					h.ySetter = function(a, h, c) {
						c.setAttribute("c" + h, a)
					};
				return h.attr(a)
			},
			arc: function(a, h, c, w, p, b) {
				q(a) ? (w = a, h = w.y, c = w.r, a = w.x) : w = {
					innerR: w,
					start: p,
					end: b
				};
				a = this.symbol("arc", a, h, c, c, w);
				a.r = c;
				return a
			},
			rect: function(a, h, c, w, p, b) {
				p = q(a) ? a.r : p;
				var x = this.createElement("rect");
				a = q(a) ? a : void 0 === a ? {} : {
					x: a,
					y: h,
					width: Math.max(c, 0),
					height: Math.max(w, 0)
				};
				void 0 !== b && (a.strokeWidth = b, a = x.crisp(a));
				a.fill = "none";
				p && (a.r = p);
				x.rSetter = function(a, h, c) {
					m(c, {
						rx: a,
						ry: a
					})
				};
				return x.attr(a)
			},
			setSize: function(a, h, c) {
				var w =
					this.alignedObjects,
					p = w.length;
				this.width = a;
				this.height = h;
				for(this.boxWrapper.animate({
						width: a,
						height: h
					}, {
						step: function() {
							this.attr({
								viewBox: "0 0 " + this.attr("width") + " " + this.attr("height")
							})
						},
						duration: L(c, !0) ? void 0 : 0
					}); p--;) w[p].align()
			},
			g: function(a) {
				var h = this.createElement("g");
				return a ? h.attr({
					"class": "highcharts-" + a
				}) : h
			},
			image: function(a, h, c, w, p) {
				var x = {
					preserveAspectRatio: "none"
				};
				1 < arguments.length && e(x, {
					x: h,
					y: c,
					width: w,
					height: p
				});
				x = this.createElement("image").attr(x);
				x.element.setAttributeNS ?
					x.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", a) : x.element.setAttribute("hc-svg-href", a);
				return x
			},
			symbol: function(a, h, c, w, p, q) {
				var x = this,
					d, n = /^url\((.*?)\)$/,
					g = n.test(a),
					z = !g && (this.symbols[a] ? a : "circle"),
					G = z && this.symbols[z],
					H = t(h) && G && G.call(this.symbols, Math.round(h), Math.round(c), w, p, q),
					v, y;
				G ? (d = this.path(H), d.attr("fill", "none"), e(d, {
					symbolName: z,
					x: h,
					y: c,
					width: w,
					height: p
				}), q && e(d, q)) : g && (v = a.match(n)[1], d = this.image(v), d.imgwidth = L(Q[v] && Q[v].width, q && q.width), d.imgheight =
					L(Q[v] && Q[v].height, q && q.height), y = function() {
						d.attr({
							width: d.width,
							height: d.height
						})
					}, b(["width", "height"], function(a) {
						d[a + "Setter"] = function(a, h) {
							var c = {},
								w = this["img" + h],
								p = "width" === h ? "translateX" : "translateY";
							this[h] = a;
							t(w) && (this.element && this.element.setAttribute(h, w), this.alignByTranslate || (c[p] = ((this[h] || 0) - w) / 2, this.attr(c)))
						}
					}), t(h) && d.attr({
						x: h,
						y: c
					}), d.isImg = !0, t(d.imgwidth) && t(d.imgheight) ? y() : (d.attr({
						width: 0,
						height: 0
					}), u("img", {
						onload: function() {
							var a = f[x.chartIndex];
							0 === this.width &&
								(r(this, {
									position: "absolute",
									top: "-999em"
								}), k.body.appendChild(this));
							Q[v] = {
								width: this.width,
								height: this.height
							};
							d.imgwidth = this.width;
							d.imgheight = this.height;
							d.element && y();
							this.parentNode && this.parentNode.removeChild(this);
							x.imgCount--;
							if(!x.imgCount && a && a.onload) a.onload()
						},
						src: v
					}), this.imgCount++));
				return d
			},
			symbols: {
				circle: function(a, h, c, w) {
					return this.arc(a + c / 2, h + w / 2, c / 2, w / 2, {
						start: 0,
						end: 2 * Math.PI,
						open: !1
					})
				},
				square: function(a, h, c, w) {
					return ["M", a, h, "L", a + c, h, a + c, h + w, a, h + w, "Z"]
				},
				triangle: function(a,
					h, c, w) {
					return ["M", a + c / 2, h, "L", a + c, h + w, a, h + w, "Z"]
				},
				"triangle-down": function(a, h, c, w) {
					return ["M", a, h, "L", a + c, h, a + c / 2, h + w, "Z"]
				},
				diamond: function(a, h, c, w) {
					return ["M", a + c / 2, h, "L", a + c, h + w / 2, a + c / 2, h + w, a, h + w / 2, "Z"]
				},
				arc: function(a, h, c, w, p) {
					var q = p.start,
						b = p.r || c,
						x = p.r || w || c,
						e = p.end - .001;
					c = p.innerR;
					w = L(p.open, .001 > Math.abs(p.end - p.start - 2 * Math.PI));
					var d = Math.cos(q),
						n = Math.sin(q),
						g = Math.cos(e),
						e = Math.sin(e);
					p = .001 > p.end - q - Math.PI ? 0 : 1;
					b = ["M", a + b * d, h + x * n, "A", b, x, 0, p, 1, a + b * g, h + x * e];
					t(c) && b.push(w ? "M" : "L", a + c *
						g, h + c * e, "A", c, c, 0, p, 0, a + c * d, h + c * n);
					b.push(w ? "" : "Z");
					return b
				},
				callout: function(a, h, c, w, p) {
					var q = Math.min(p && p.r || 0, c, w),
						b = q + 6,
						e = p && p.anchorX;
					p = p && p.anchorY;
					var d;
					d = ["M", a + q, h, "L", a + c - q, h, "C", a + c, h, a + c, h, a + c, h + q, "L", a + c, h + w - q, "C", a + c, h + w, a + c, h + w, a + c - q, h + w, "L", a + q, h + w, "C", a, h + w, a, h + w, a, h + w - q, "L", a, h + q, "C", a, h, a, h, a + q, h];
					e && e > c ? p > h + b && p < h + w - b ? d.splice(13, 3, "L", a + c, p - 6, a + c + 6, p, a + c, p + 6, a + c, h + w - q) : d.splice(13, 3, "L", a + c, w / 2, e, p, a + c, w / 2, a + c, h + w - q) : e && 0 > e ? p > h + b && p < h + w - b ? d.splice(33, 3, "L", a, p + 6, a - 6, p, a, p - 6,
						a, h + q) : d.splice(33, 3, "L", a, w / 2, e, p, a, w / 2, a, h + q) : p && p > w && e > a + b && e < a + c - b ? d.splice(23, 3, "L", e + 6, h + w, e, h + w + 6, e - 6, h + w, a + q, h + w) : p && 0 > p && e > a + b && e < a + c - b && d.splice(3, 3, "L", e - 6, h, e, h - 6, e + 6, h, c - q, h);
					return d
				}
			},
			clipRect: function(h, c, w, p) {
				var q = a.uniqueKey(),
					b = this.createElement("clipPath").attr({
						id: q
					}).add(this.defs);
				h = this.rect(h, c, w, p, 0).add(b);
				h.id = q;
				h.clipPath = b;
				h.count = 0;
				return h
			},
			text: function(a, h, c, w) {
				var p = !H && this.forExport,
					q = {};
				if(w && (this.allowHTML || !this.forExport)) return this.html(a, h, c);
				q.x = Math.round(h ||
					0);
				c && (q.y = Math.round(c));
				if(a || 0 === a) q.text = a;
				a = this.createElement("text").attr(q);
				p && a.css({
					position: "absolute"
				});
				w || (a.xSetter = function(a, h, c) {
					var w = c.getElementsByTagName("tspan"),
						p, q = c.getAttribute(h),
						b;
					for(b = 0; b < w.length; b++) p = w[b], p.getAttribute(h) === q && p.setAttribute(h, a);
					c.setAttribute(h, a)
				});
				return a
			},
			fontMetrics: function(a, c) {
				a = a || c && c.style && c.style.fontSize || this.style && this.style.fontSize;
				a = /px/.test(a) ? h(a) : /em/.test(a) ? parseFloat(a) * (c ? this.fontMetrics(null, c.parentNode).f : 16) : 12;
				c = 24 > a ? a + 3 : Math.round(1.2 * a);
				return {
					h: c,
					b: Math.round(.8 * c),
					f: a
				}
			},
			rotCorr: function(a, h, c) {
				var w = a;
				h && c && (w = Math.max(w * Math.cos(h * g), 4));
				return {
					x: -a / 3 * Math.sin(h * g),
					y: w
				}
			},
			label: function(h, c, q, d, n, g, k, z, G) {
				var x = this,
					H = x.g("button" !== G && "label"),
					v = H.text = x.text("", 0, 0, k).attr({
						zIndex: 1
					}),
					f, y, I = 0,
					B = 3,
					D = 0,
					r, l, P, m, J, O = {},
					L, u, N = /^url\((.*?)\)$/.test(d),
					K = N,
					U, T, Q, R;
				G && H.addClass("highcharts-" + G);
				K = N;
				U = function() {
					return(L || 0) % 2 / 2
				};
				T = function() {
					var a = v.element.style,
						h = {};
					y = (void 0 === r || void 0 === l || J) && t(v.textStr) &&
						v.getBBox();
					H.width = (r || y.width || 0) + 2 * B + D;
					H.height = (l || y.height || 0) + 2 * B;
					u = B + x.fontMetrics(a && a.fontSize, v).b;
					K && (f || (H.box = f = x.symbols[d] || N ? x.symbol(d) : x.rect(), f.addClass(("button" === G ? "" : "highcharts-label-box") + (G ? " highcharts-" + G + "-box" : "")), f.add(H), a = U(), h.x = a, h.y = (z ? -u : 0) + a), h.width = Math.round(H.width), h.height = Math.round(H.height), f.attr(e(h, O)), O = {})
				};
				Q = function() {
					var a = D + B,
						h;
					h = z ? 0 : u;
					t(r) && y && ("center" === J || "right" === J) && (a += {
						center: .5,
						right: 1
					}[J] * (r - y.width));
					if(a !== v.x || h !== v.y) v.attr("x",
						a), void 0 !== h && v.attr("y", h);
					v.x = a;
					v.y = h
				};
				R = function(a, h) {
					f ? f.attr(a, h) : O[a] = h
				};
				H.onAdd = function() {
					v.add(H);
					H.attr({
						text: h || 0 === h ? h : "",
						x: c,
						y: q
					});
					f && t(n) && H.attr({
						anchorX: n,
						anchorY: g
					})
				};
				H.widthSetter = function(h) {
					r = a.isNumber(h) ? h : null
				};
				H.heightSetter = function(a) {
					l = a
				};
				H["text-alignSetter"] = function(a) {
					J = a
				};
				H.paddingSetter = function(a) {
					t(a) && a !== B && (B = H.padding = a, Q())
				};
				H.paddingLeftSetter = function(a) {
					t(a) && a !== D && (D = a, Q())
				};
				H.alignSetter = function(a) {
					a = {
						left: 0,
						center: .5,
						right: 1
					}[a];
					a !== I && (I = a, y && H.attr({
						x: P
					}))
				};
				H.textSetter = function(a) {
					void 0 !== a && v.textSetter(a);
					T();
					Q()
				};
				H["stroke-widthSetter"] = function(a, h) {
					a && (K = !0);
					L = this["stroke-width"] = a;
					R(h, a)
				};
				H.strokeSetter = H.fillSetter = H.rSetter = function(a, h) {
					"r" !== h && ("fill" === h && a && (K = !0), H[h] = a);
					R(h, a)
				};
				H.anchorXSetter = function(a, h) {
					n = H.anchorX = a;
					R(h, Math.round(a) - U() - P)
				};
				H.anchorYSetter = function(a, h) {
					g = H.anchorY = a;
					R(h, a - m)
				};
				H.xSetter = function(a) {
					H.x = a;
					I && (a -= I * ((r || y.width) + 2 * B));
					P = Math.round(a);
					H.attr("translateX", P)
				};
				H.ySetter = function(a) {
					m = H.y = Math.round(a);
					H.attr("translateY", m)
				};
				var V = H.css;
				return e(H, {
					css: function(a) {
						if(a) {
							var h = {};
							a = p(a);
							b(H.textProps, function(c) {
								void 0 !== a[c] && (h[c] = a[c], delete a[c])
							});
							v.css(h)
						}
						return V.call(H, a)
					},
					getBBox: function() {
						return {
							width: y.width + 2 * B,
							height: y.height + 2 * B,
							x: y.x - B,
							y: y.y - B
						}
					},
					shadow: function(a) {
						a && (T(), f && f.shadow(a));
						return H
					},
					destroy: function() {
						w(H.element, "mouseenter");
						w(H.element, "mouseleave");
						v && (v = v.destroy());
						f && (f = f.destroy());
						C.prototype.destroy.call(H);
						H = x = T = Q = R = null
					}
				})
			}
		});
		a.Renderer = A
	})(M);
	(function(a) {
		var C =
			a.attr,
			A = a.createElement,
			F = a.css,
			E = a.defined,
			m = a.each,
			f = a.extend,
			l = a.isFirefox,
			r = a.isMS,
			u = a.isWebKit,
			t = a.pInt,
			g = a.SVGRenderer,
			d = a.win,
			k = a.wrap;
		f(a.SVGElement.prototype, {
			htmlCss: function(a) {
				var b = this.element;
				if(b = a && "SPAN" === b.tagName && a.width) delete a.width, this.textWidth = b, this.updateTransform();
				a && "ellipsis" === a.textOverflow && (a.whiteSpace = "nowrap", a.overflow = "hidden");
				this.styles = f(this.styles, a);
				F(this.element, a);
				return this
			},
			htmlGetBBox: function() {
				var a = this.element;
				"text" === a.nodeName && (a.style.position =
					"absolute");
				return {
					x: a.offsetLeft,
					y: a.offsetTop,
					width: a.offsetWidth,
					height: a.offsetHeight
				}
			},
			htmlUpdateTransform: function() {
				if(this.added) {
					var a = this.renderer,
						e = this.element,
						d = this.translateX || 0,
						g = this.translateY || 0,
						n = this.x || 0,
						k = this.y || 0,
						f = this.textAlign || "left",
						c = {
							left: 0,
							center: .5,
							right: 1
						}[f],
						G = this.styles;
					F(e, {
						marginLeft: d,
						marginTop: g
					});
					this.shadows && m(this.shadows, function(a) {
						F(a, {
							marginLeft: d + 1,
							marginTop: g + 1
						})
					});
					this.inverted && m(e.childNodes, function(c) {
						a.invertChild(c, e)
					});
					if("SPAN" === e.tagName) {
						var q =
							this.rotation,
							B = t(this.textWidth),
							r = G && G.whiteSpace,
							p = [q, f, e.innerHTML, this.textWidth, this.textAlign].join();
						p !== this.cTT && (G = a.fontMetrics(e.style.fontSize).b, E(q) && this.setSpanRotation(q, c, G), F(e, {
							width: "",
							whiteSpace: r || "nowrap"
						}), e.offsetWidth > B && /[ \-]/.test(e.textContent || e.innerText) && F(e, {
							width: B + "px",
							display: "block",
							whiteSpace: r || "normal"
						}), this.getSpanCorrection(e.offsetWidth, G, c, q, f));
						F(e, {
							left: n + (this.xCorr || 0) + "px",
							top: k + (this.yCorr || 0) + "px"
						});
						u && (G = e.offsetHeight);
						this.cTT = p
					}
				} else this.alignOnAdd = !0
			},
			setSpanRotation: function(a, e, g) {
				var b = {},
					n = r ? "-ms-transform" : u ? "-webkit-transform" : l ? "MozTransform" : d.opera ? "-o-transform" : "";
				b[n] = b.transform = "rotate(" + a + "deg)";
				b[n + (l ? "Origin" : "-origin")] = b.transformOrigin = 100 * e + "% " + g + "px";
				F(this.element, b)
			},
			getSpanCorrection: function(a, e, d) {
				this.xCorr = -a * d;
				this.yCorr = -e
			}
		});
		f(g.prototype, {
			html: function(a, e, d) {
				var b = this.createElement("span"),
					n = b.element,
					g = b.renderer,
					v = g.isSVG,
					c = function(a, c) {
						m(["opacity", "visibility"], function(q) {
							k(a, q + "Setter", function(a,
								p, q, b) {
								a.call(this, p, q, b);
								c[q] = p
							})
						})
					};
				b.textSetter = function(a) {
					a !== n.innerHTML && delete this.bBox;
					n.innerHTML = this.textStr = a;
					b.htmlUpdateTransform()
				};
				v && c(b, b.element.style);
				b.xSetter = b.ySetter = b.alignSetter = b.rotationSetter = function(a, c) {
					"align" === c && (c = "textAlign");
					b[c] = a;
					b.htmlUpdateTransform()
				};
				b.attr({
					text: a,
					x: Math.round(e),
					y: Math.round(d)
				}).css({
					fontFamily: this.style.fontFamily,
					fontSize: this.style.fontSize,
					position: "absolute"
				});
				n.style.whiteSpace = "nowrap";
				b.css = b.htmlCss;
				v && (b.add = function(a) {
					var q,
						e = g.box.parentNode,
						d = [];
					if(this.parentGroup = a) {
						if(q = a.div, !q) {
							for(; a;) d.push(a), a = a.parentGroup;
							m(d.reverse(), function(a) {
								var p, n = C(a.element, "class");
								n && (n = {
									className: n
								});
								q = a.div = a.div || A("div", n, {
									position: "absolute",
									left: (a.translateX || 0) + "px",
									top: (a.translateY || 0) + "px",
									display: a.display,
									opacity: a.opacity,
									pointerEvents: a.styles && a.styles.pointerEvents
								}, q || e);
								p = q.style;
								f(a, {
									classSetter: function(a) {
										this.element.setAttribute("class", a);
										q.className = a
									},
									on: function() {
										d[0].div && b.on.apply({
												element: d[0].div
											},
											arguments);
										return a
									},
									translateXSetter: function(c, h) {
										p.left = c + "px";
										a[h] = c;
										a.doTransform = !0
									},
									translateYSetter: function(c, h) {
										p.top = c + "px";
										a[h] = c;
										a.doTransform = !0
									}
								});
								c(a, p)
							})
						}
					} else q = e;
					q.appendChild(n);
					b.added = !0;
					b.alignOnAdd && b.htmlUpdateTransform();
					return b
				});
				return b
			}
		})
	})(M);
	(function(a) {
		var C, A, F = a.createElement,
			E = a.css,
			m = a.defined,
			f = a.deg2rad,
			l = a.discardElement,
			r = a.doc,
			u = a.each,
			t = a.erase,
			g = a.extend;
		C = a.extendClass;
		var d = a.isArray,
			k = a.isNumber,
			b = a.isObject,
			e = a.merge;
		A = a.noop;
		var v = a.pick,
			y = a.pInt,
			n = a.SVGElement,
			D = a.SVGRenderer,
			J = a.win;
		a.svg || (A = {
			docMode8: r && 8 === r.documentMode,
			init: function(a, b) {
				var c = ["\x3c", b, ' filled\x3d"f" stroked\x3d"f"'],
					e = ["position: ", "absolute", ";"],
					d = "div" === b;
				("shape" === b || d) && e.push("left:0;top:0;width:1px;height:1px;");
				e.push("visibility: ", d ? "hidden" : "visible");
				c.push(' style\x3d"', e.join(""), '"/\x3e');
				b && (c = d || "span" === b || "img" === b ? c.join("") : a.prepVML(c), this.element = F(c));
				this.renderer = a
			},
			add: function(a) {
				var c = this.renderer,
					b = this.element,
					e = c.box,
					d = a && a.inverted,
					e = a ? a.element || a : e;
				a && (this.parentGroup = a);
				d && c.invertChild(b, e);
				e.appendChild(b);
				this.added = !0;
				this.alignOnAdd && !this.deferUpdateTransform && this.updateTransform();
				if(this.onAdd) this.onAdd();
				this.className && this.attr("class", this.className);
				return this
			},
			updateTransform: n.prototype.htmlUpdateTransform,
			setSpanRotation: function() {
				var a = this.rotation,
					b = Math.cos(a * f),
					q = Math.sin(a * f);
				E(this.element, {
					filter: a ? ["progid:DXImageTransform.Microsoft.Matrix(M11\x3d", b, ", M12\x3d", -q, ", M21\x3d", q, ", M22\x3d",
						b, ", sizingMethod\x3d'auto expand')"
					].join("") : "none"
				})
			},
			getSpanCorrection: function(a, b, q, e, d) {
				var c = e ? Math.cos(e * f) : 1,
					n = e ? Math.sin(e * f) : 0,
					g = v(this.elemHeight, this.element.offsetHeight),
					k;
				this.xCorr = 0 > c && -a;
				this.yCorr = 0 > n && -g;
				k = 0 > c * n;
				this.xCorr += n * b * (k ? 1 - q : q);
				this.yCorr -= c * b * (e ? k ? q : 1 - q : 1);
				d && "left" !== d && (this.xCorr -= a * q * (0 > c ? -1 : 1), e && (this.yCorr -= g * q * (0 > n ? -1 : 1)), E(this.element, {
					textAlign: d
				}))
			},
			pathToVML: function(a) {
				for(var c = a.length, b = []; c--;) k(a[c]) ? b[c] = Math.round(10 * a[c]) - 5 : "Z" === a[c] ? b[c] = "x" :
					(b[c] = a[c], !a.isArc || "wa" !== a[c] && "at" !== a[c] || (b[c + 5] === b[c + 7] && (b[c + 7] += a[c + 7] > a[c + 5] ? 1 : -1), b[c + 6] === b[c + 8] && (b[c + 8] += a[c + 8] > a[c + 6] ? 1 : -1)));
				return b.join(" ") || "x"
			},
			clip: function(a) {
				var c = this,
					b;
				a ? (b = a.members, t(b, c), b.push(c), c.destroyClip = function() {
					t(b, c)
				}, a = a.getCSS(c)) : (c.destroyClip && c.destroyClip(), a = {
					clip: c.docMode8 ? "inherit" : "rect(auto)"
				});
				return c.css(a)
			},
			css: n.prototype.htmlCss,
			safeRemoveChild: function(a) {
				a.parentNode && l(a)
			},
			destroy: function() {
				this.destroyClip && this.destroyClip();
				return n.prototype.destroy.apply(this)
			},
			on: function(a, b) {
				this.element["on" + a] = function() {
					var a = J.event;
					a.target = a.srcElement;
					b(a)
				};
				return this
			},
			cutOffPath: function(a, b) {
				var c;
				a = a.split(/[ ,]/);
				c = a.length;
				if(9 === c || 11 === c) a[c - 4] = a[c - 2] = y(a[c - 2]) - 10 * b;
				return a.join(" ")
			},
			shadow: function(a, b, e) {
				var c = [],
					q, p = this.element,
					d = this.renderer,
					n, g = p.style,
					h, w = p.path,
					k, H, f, D;
				w && "string" !== typeof w.value && (w = "x");
				H = w;
				if(a) {
					f = v(a.width, 3);
					D = (a.opacity || .15) / f;
					for(q = 1; 3 >= q; q++) k = 2 * f + 1 - 2 * q, e && (H = this.cutOffPath(w.value, k + .5)), h = ['\x3cshape isShadow\x3d"true" strokeweight\x3d"',
						k, '" filled\x3d"false" path\x3d"', H, '" coordsize\x3d"10 10" style\x3d"', p.style.cssText, '" /\x3e'
					], n = F(d.prepVML(h), null, {
						left: y(g.left) + v(a.offsetX, 1),
						top: y(g.top) + v(a.offsetY, 1)
					}), e && (n.cutOff = k + 1), h = ['\x3cstroke color\x3d"', a.color || "#000000", '" opacity\x3d"', D * q, '"/\x3e'], F(d.prepVML(h), null, null, n), b ? b.element.appendChild(n) : p.parentNode.insertBefore(n, p), c.push(n);
					this.shadows = c
				}
				return this
			},
			updateShadows: A,
			setAttr: function(a, b) {
				this.docMode8 ? this.element[a] = b : this.element.setAttribute(a, b)
			},
			classSetter: function(a) {
				(this.added ? this.element : this).className = a
			},
			dashstyleSetter: function(a, b, e) {
				(e.getElementsByTagName("stroke")[0] || F(this.renderer.prepVML(["\x3cstroke/\x3e"]), null, null, e))[b] = a || "solid";
				this[b] = a
			},
			dSetter: function(a, b, e) {
				var c = this.shadows;
				a = a || [];
				this.d = a.join && a.join(" ");
				e.path = a = this.pathToVML(a);
				if(c)
					for(e = c.length; e--;) c[e].path = c[e].cutOff ? this.cutOffPath(a, c[e].cutOff) : a;
				this.setAttr(b, a)
			},
			fillSetter: function(a, b, e) {
				var c = e.nodeName;
				"SPAN" === c ? e.style.color = a : "IMG" !==
					c && (e.filled = "none" !== a, this.setAttr("fillcolor", this.renderer.color(a, e, b, this)))
			},
			"fill-opacitySetter": function(a, b, e) {
				F(this.renderer.prepVML(["\x3c", b.split("-")[0], ' opacity\x3d"', a, '"/\x3e']), null, null, e)
			},
			opacitySetter: A,
			rotationSetter: function(a, b, e) {
				e = e.style;
				this[b] = e[b] = a;
				e.left = -Math.round(Math.sin(a * f) + 1) + "px";
				e.top = Math.round(Math.cos(a * f)) + "px"
			},
			strokeSetter: function(a, b, e) {
				this.setAttr("strokecolor", this.renderer.color(a, e, b, this))
			},
			"stroke-widthSetter": function(a, b, e) {
				e.stroked = !!a;
				this[b] = a;
				k(a) && (a += "px");
				this.setAttr("strokeweight", a)
			},
			titleSetter: function(a, b) {
				this.setAttr(b, a)
			},
			visibilitySetter: function(a, b, e) {
				"inherit" === a && (a = "visible");
				this.shadows && u(this.shadows, function(c) {
					c.style[b] = a
				});
				"DIV" === e.nodeName && (a = "hidden" === a ? "-999em" : 0, this.docMode8 || (e.style[b] = a ? "visible" : "hidden"), b = "top");
				e.style[b] = a
			},
			xSetter: function(a, b, e) {
				this[b] = a;
				"x" === b ? b = "left" : "y" === b && (b = "top");
				this.updateClipping ? (this[b] = a, this.updateClipping()) : e.style[b] = a
			},
			zIndexSetter: function(a,
				b, e) {
				e.style[b] = a
			}
		}, A["stroke-opacitySetter"] = A["fill-opacitySetter"], a.VMLElement = A = C(n, A), A.prototype.ySetter = A.prototype.widthSetter = A.prototype.heightSetter = A.prototype.xSetter, A = {
			Element: A,
			isIE8: -1 < J.navigator.userAgent.indexOf("MSIE 8.0"),
			init: function(a, b, e) {
				var c, d;
				this.alignedObjects = [];
				c = this.createElement("div").css({
					position: "relative"
				});
				d = c.element;
				a.appendChild(c.element);
				this.isVML = !0;
				this.box = d;
				this.boxWrapper = c;
				this.gradients = {};
				this.cache = {};
				this.cacheKeys = [];
				this.imgCount = 0;
				this.setSize(b,
					e, !1);
				if(!r.namespaces.hcv) {
					r.namespaces.add("hcv", "urn:schemas-microsoft-com:vml");
					try {
						r.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
					} catch(p) {
						r.styleSheets[0].cssText += "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
					}
				}
			},
			isHidden: function() {
				return !this.box.offsetWidth
			},
			clipRect: function(a, e, d, n) {
				var c = this.createElement(),
					p = b(a);
				return g(c, {
					members: [],
					count: 0,
					left: (p ? a.x : a) + 1,
					top: (p ? a.y : e) + 1,
					width: (p ? a.width : d) - 1,
					height: (p ? a.height : n) - 1,
					getCSS: function(a) {
						var c = a.element,
							b = c.nodeName,
							h = a.inverted,
							w = this.top - ("shape" === b ? c.offsetTop : 0),
							p = this.left,
							c = p + this.width,
							e = w + this.height,
							w = {
								clip: "rect(" + Math.round(h ? p : w) + "px," + Math.round(h ? e : c) + "px," + Math.round(h ? c : e) + "px," + Math.round(h ? w : p) + "px)"
							};
						!h && a.docMode8 && "DIV" === b && g(w, {
							width: c + "px",
							height: e + "px"
						});
						return w
					},
					updateClipping: function() {
						u(c.members, function(a) {
							a.element && a.css(c.getCSS(a))
						})
					}
				})
			},
			color: function(c,
				b, e, d) {
				var q = this,
					p, n = /^rgba/,
					g, k, h = "none";
				c && c.linearGradient ? k = "gradient" : c && c.radialGradient && (k = "pattern");
				if(k) {
					var w, v, H = c.linearGradient || c.radialGradient,
						f, D, y, x, r, B = "";
					c = c.stops;
					var l, G = [],
						m = function() {
							g = ['\x3cfill colors\x3d"' + G.join(",") + '" opacity\x3d"', y, '" o:opacity2\x3d"', D, '" type\x3d"', k, '" ', B, 'focus\x3d"100%" method\x3d"any" /\x3e'];
							F(q.prepVML(g), null, null, b)
						};
					f = c[0];
					l = c[c.length - 1];
					0 < f[0] && c.unshift([0, f[1]]);
					1 > l[0] && c.push([1, l[1]]);
					u(c, function(h, c) {
						n.test(h[1]) ? (p = a.color(h[1]),
							w = p.get("rgb"), v = p.get("a")) : (w = h[1], v = 1);
						G.push(100 * h[0] + "% " + w);
						c ? (y = v, x = w) : (D = v, r = w)
					});
					if("fill" === e)
						if("gradient" === k) e = H.x1 || H[0] || 0, c = H.y1 || H[1] || 0, f = H.x2 || H[2] || 0, H = H.y2 || H[3] || 0, B = 'angle\x3d"' + (90 - 180 * Math.atan((H - c) / (f - e)) / Math.PI) + '"', m();
						else {
							var h = H.r,
								t = 2 * h,
								J = 2 * h,
								A = H.cx,
								C = H.cy,
								E = b.radialReference,
								M, h = function() {
									E && (M = d.getBBox(), A += (E[0] - M.x) / M.width - .5, C += (E[1] - M.y) / M.height - .5, t *= E[2] / M.width, J *= E[2] / M.height);
									B = 'src\x3d"' + a.getOptions().global.VMLRadialGradientURL + '" size\x3d"' + t + "," +
										J + '" origin\x3d"0.5,0.5" position\x3d"' + A + "," + C + '" color2\x3d"' + r + '" ';
									m()
								};
							d.added ? h() : d.onAdd = h;
							h = x
						}
					else h = w
				} else n.test(c) && "IMG" !== b.tagName ? (p = a.color(c), d[e + "-opacitySetter"](p.get("a"), e, b), h = p.get("rgb")) : (h = b.getElementsByTagName(e), h.length && (h[0].opacity = 1, h[0].type = "solid"), h = c);
				return h
			},
			prepVML: function(a) {
				var c = this.isIE8;
				a = a.join("");
				c ? (a = a.replace("/\x3e", ' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'), a = -1 === a.indexOf('style\x3d"') ? a.replace("/\x3e", ' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e') :
					a.replace('style\x3d"', 'style\x3d"display:inline-block;behavior:url(#default#VML);')) : a = a.replace("\x3c", "\x3chcv:");
				return a
			},
			text: D.prototype.html,
			path: function(a) {
				var c = {
					coordsize: "10 10"
				};
				d(a) ? c.d = a : b(a) && g(c, a);
				return this.createElement("shape").attr(c)
			},
			circle: function(a, e, d) {
				var c = this.symbol("circle");
				b(a) && (d = a.r, e = a.y, a = a.x);
				c.isCircle = !0;
				c.r = d;
				return c.attr({
					x: a,
					y: e
				})
			},
			g: function(a) {
				var c;
				a && (c = {
					className: "highcharts-" + a,
					"class": "highcharts-" + a
				});
				return this.createElement("div").attr(c)
			},
			image: function(a, b, e, d, n) {
				var c = this.createElement("img").attr({
					src: a
				});
				1 < arguments.length && c.attr({
					x: b,
					y: e,
					width: d,
					height: n
				});
				return c
			},
			createElement: function(a) {
				return "rect" === a ? this.symbol(a) : D.prototype.createElement.call(this, a)
			},
			invertChild: function(a, b) {
				var c = this;
				b = b.style;
				var e = "IMG" === a.tagName && a.style;
				E(a, {
					flip: "x",
					left: y(b.width) - (e ? y(e.top) : 1),
					top: y(b.height) - (e ? y(e.left) : 1),
					rotation: -90
				});
				u(a.childNodes, function(b) {
					c.invertChild(b, a)
				})
			},
			symbols: {
				arc: function(a, b, e, d, n) {
					var c = n.start,
						q = n.end,
						g = n.r || e || d;
					e = n.innerR;
					d = Math.cos(c);
					var k = Math.sin(c),
						h = Math.cos(q),
						w = Math.sin(q);
					if(0 === q - c) return ["x"];
					c = ["wa", a - g, b - g, a + g, b + g, a + g * d, b + g * k, a + g * h, b + g * w];
					n.open && !e && c.push("e", "M", a, b);
					c.push("at", a - e, b - e, a + e, b + e, a + e * h, b + e * w, a + e * d, b + e * k, "x", "e");
					c.isArc = !0;
					return c
				},
				circle: function(a, b, e, d, n) {
					n && m(n.r) && (e = d = 2 * n.r);
					n && n.isCircle && (a -= e / 2, b -= d / 2);
					return ["wa", a, b, a + e, b + d, a + e, b + d / 2, a + e, b + d / 2, "e"]
				},
				rect: function(a, b, e, d, n) {
					return D.prototype.symbols[m(n) && n.r ? "callout" : "square"].call(0, a, b,
						e, d, n)
				}
			}
		}, a.VMLRenderer = C = function() {
			this.init.apply(this, arguments)
		}, C.prototype = e(D.prototype, A), a.Renderer = C);
		D.prototype.measureSpanWidth = function(a, b) {
			var c = r.createElement("span");
			a = r.createTextNode(a);
			c.appendChild(a);
			E(c, b);
			this.box.appendChild(c);
			b = c.offsetWidth;
			l(c);
			return b
		}
	})(M);
	(function(a) {
		function C() {
			var f = a.defaultOptions.global,
				l = r.moment;
			if(f.timezone) {
				if(l) return function(a) {
					return -l.tz(a, f.timezone).utcOffset()
				};
				a.error(25)
			}
			return f.useUTC && f.getTimezoneOffset
		}

		function A() {
			var f =
				a.defaultOptions.global,
				t, g = f.useUTC,
				d = g ? "getUTC" : "get",
				k = g ? "setUTC" : "set";
			a.Date = t = f.Date || r.Date;
			t.hcTimezoneOffset = g && f.timezoneOffset;
			t.hcGetTimezoneOffset = C();
			t.hcMakeTime = function(a, e, d, k, n, f) {
				var b;
				g ? (b = t.UTC.apply(0, arguments), b += m(b)) : b = (new t(a, e, l(d, 1), l(k, 0), l(n, 0), l(f, 0))).getTime();
				return b
			};
			E("Minutes Hours Day Date Month FullYear".split(" "), function(a) {
				t["hcGet" + a] = d + a
			});
			E("Milliseconds Seconds Minutes Hours Date Month FullYear".split(" "), function(a) {
				t["hcSet" + a] = k + a
			})
		}
		var F = a.color,
			E = a.each,
			m = a.getTZOffset,
			f = a.merge,
			l = a.pick,
			r = a.win;
		a.defaultOptions = {
			colors: "#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1".split(" "),
			symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
			lang: {
				loading: "Loading...",
				months: "January February March April May June July August September October November December".split(" "),
				shortMonths: "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
				weekdays: "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
				decimalPoint: ".",
				numericSymbols: "kMGTPE".split(""),
				resetZoom: "Reset zoom",
				resetZoomTitle: "Reset zoom level 1:1",
				thousandsSep: " "
			},
			global: {
				useUTC: !0,
				VMLRadialGradientURL: "http://code.highcharts.com/5.0.14/gfx/vml-radial-gradient.png"
			},
			chart: {
				borderRadius: 0,
				defaultSeriesType: "line",
				ignoreHiddenSeries: !0,
				spacing: [10, 10, 15, 10],
				resetZoomButton: {
					theme: {
						zIndex: 20
					},
					position: {
						align: "right",
						x: -10,
						y: 10
					}
				},
				width: null,
				height: null,
				borderColor: "#335cad",
				backgroundColor: "#ffffff",
				plotBorderColor: "#cccccc"
			},
			title: {
				text: "Chart title",
				align: "center",
				margin: 15,
				widthAdjust: -44
			},
			subtitle: {
				text: "",
				align: "center",
				widthAdjust: -44
			},
			plotOptions: {},
			labels: {
				style: {
					position: "absolute",
					color: "#333333"
				}
			},
			legend: {
				enabled: !0,
				align: "center",
				layout: "horizontal",
				labelFormatter: function() {
					return this.name
				},
				borderColor: "#999999",
				borderRadius: 0,
				navigation: {
					activeColor: "#003399",
					inactiveColor: "#cccccc"
				},
				itemStyle: {
					color: "#333333",
					fontSize: "12px",
					fontWeight: "bold",
					textOverflow: "ellipsis"
				},
				itemHoverStyle: {
					color: "#000000"
				},
				itemHiddenStyle: {
					color: "#cccccc"
				},
				shadow: !1,
				itemCheckboxStyle: {
					position: "absolute",
					width: "13px",
					height: "13px"
				},
				squareSymbol: !0,
				symbolPadding: 5,
				verticalAlign: "bottom",
				x: 0,
				y: 0,
				title: {
					style: {
						fontWeight: "bold"
					}
				}
			},
			loading: {
				labelStyle: {
					fontWeight: "bold",
					position: "relative",
					top: "45%"
				},
				style: {
					position: "absolute",
					backgroundColor: "#ffffff",
					opacity: .5,
					textAlign: "center"
				}
			},
			tooltip: {
				enabled: !0,
				animation: a.svg,
				borderRadius: 3,
				dateTimeLabelFormats: {
					millisecond: "%A, %b %e, %H:%M:%S.%L",
					second: "%A, %b %e, %H:%M:%S",
					minute: "%A, %b %e, %H:%M",
					hour: "%A, %b %e, %H:%M",
					day: "%A, %b %e, %Y",
					week: "Week from %A, %b %e, %Y",
					month: "%B %Y",
					year: "%Y"
				},
				footerFormat: "",
				padding: 8,
				snap: a.isTouchDevice ? 25 : 10,
				backgroundColor: F("#f7f7f7").setOpacity(.85).get(),
				borderWidth: 1,
				headerFormat: '\x3cspan style\x3d"font-size: 10px"\x3e{point.key}\x3c/span\x3e\x3cbr/\x3e',
				pointFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e',
				shadow: !0,
				style: {
					color: "#333333",
					cursor: "default",
					fontSize: "12px",
					pointerEvents: "none",
					whiteSpace: "nowrap"
				}
			},
			credits: {
				enabled: !0,
				href: "http://www.highcharts.com",
				position: {
					align: "right",
					x: -10,
					verticalAlign: "bottom",
					y: -5
				},
				style: {
					cursor: "pointer",
					color: "#999999",
					fontSize: "9px"
				},
				text: "Highcharts.com"
			}
		};
		a.setOptions = function(r) {
			a.defaultOptions = f(!0, a.defaultOptions, r);
			A();
			return a.defaultOptions
		};
		a.getOptions = function() {
			return a.defaultOptions
		};
		a.defaultPlotOptions = a.defaultOptions.plotOptions;
		A()
	})(M);
	(function(a) {
		var C = a.correctFloat,
			A = a.defined,
			F = a.destroyObjectProperties,
			E = a.isNumber,
			m = a.merge,
			f = a.pick,
			l = a.deg2rad;
		a.Tick = function(a, f, l, g) {
			this.axis = a;
			this.pos = f;
			this.type = l || "";
			this.isNewLabel = this.isNew = !0;
			l || g || this.addLabel()
		};
		a.Tick.prototype = {
			addLabel: function() {
				var a = this.axis,
					l = a.options,
					t = a.chart,
					g = a.categories,
					d = a.names,
					k = this.pos,
					b = l.labels,
					e = a.tickPositions,
					v = k === e[0],
					y = k === e[e.length - 1],
					d = g ? f(g[k], d[k], k) : k,
					g = this.label,
					e = e.info,
					n;
				a.isDatetimeAxis && e && (n = l.dateTimeLabelFormats[e.higherRanks[k] || e.unitName]);
				this.isFirst = v;
				this.isLast = y;
				l = a.labelFormatter.call({
					axis: a,
					chart: t,
					isFirst: v,
					isLast: y,
					dateTimeLabelFormat: n,
					value: a.isLog ? C(a.lin2log(d)) : d,
					pos: k
				});
				A(g) ? g && g.attr({
					text: l
				}) : (this.labelLength = (this.label = g = A(l) && b.enabled ? t.renderer.text(l, 0, 0, b.useHTML).css(m(b.style)).add(a.labelGroup) : null) && g.getBBox().width, this.rotation = 0)
			},
			getLabelSize: function() {
				return this.label ? this.label.getBBox()[this.axis.horiz ? "height" : "width"] : 0
			},
			handleOverflow: function(a) {
				var r = this.axis,
					m = a.x,
					g = r.chart.chartWidth,
					d = r.chart.spacing,
					k = f(r.labelLeft, Math.min(r.pos, d[3])),
					d = f(r.labelRight,
						Math.max(r.pos + r.len, g - d[1])),
					b = this.label,
					e = this.rotation,
					v = {
						left: 0,
						center: .5,
						right: 1
					}[r.labelAlign],
					y = b.getBBox().width,
					n = r.getSlotWidth(),
					D = n,
					J = 1,
					c, G = {};
				if(e) 0 > e && m - v * y < k ? c = Math.round(m / Math.cos(e * l) - k) : 0 < e && m + v * y > d && (c = Math.round((g - m) / Math.cos(e * l)));
				else if(g = m + (1 - v) * y, m - v * y < k ? D = a.x + D * (1 - v) - k : g > d && (D = d - a.x + D * v, J = -1), D = Math.min(n, D), D < n && "center" === r.labelAlign && (a.x += J * (n - D - v * (n - Math.min(y, D)))), y > D || r.autoRotation && (b.styles || {}).width) c = D;
				c && (G.width = c, (r.options.labels.style || {}).textOverflow ||
					(G.textOverflow = "ellipsis"), b.css(G))
			},
			getPosition: function(a, f, l, g) {
				var d = this.axis,
					k = d.chart,
					b = g && k.oldChartHeight || k.chartHeight;
				return {
					x: a ? d.translate(f + l, null, null, g) + d.transB : d.left + d.offset + (d.opposite ? (g && k.oldChartWidth || k.chartWidth) - d.right - d.left : 0),
					y: a ? b - d.bottom + d.offset - (d.opposite ? d.height : 0) : b - d.translate(f + l, null, null, g) - d.transB
				}
			},
			getLabelPosition: function(a, f, m, g, d, k, b, e) {
				var v = this.axis,
					y = v.transA,
					n = v.reversed,
					D = v.staggerLines,
					r = v.tickRotCorr || {
						x: 0,
						y: 0
					},
					c = d.y;
				A(c) || (c = 0 === v.side ?
					m.rotation ? -8 : -m.getBBox().height : 2 === v.side ? r.y + 8 : Math.cos(m.rotation * l) * (r.y - m.getBBox(!1, 0).height / 2));
				a = a + d.x + r.x - (k && g ? k * y * (n ? -1 : 1) : 0);
				f = f + c - (k && !g ? k * y * (n ? 1 : -1) : 0);
				D && (m = b / (e || 1) % D, v.opposite && (m = D - m - 1), f += v.labelOffset / D * m);
				return {
					x: a,
					y: Math.round(f)
				}
			},
			getMarkPath: function(a, f, l, g, d, k) {
				return k.crispLine(["M", a, f, "L", a + (d ? 0 : -l), f + (d ? l : 0)], g)
			},
			renderGridLine: function(a, f, l) {
				var g = this.axis,
					d = g.options,
					k = this.gridLine,
					b = {},
					e = this.pos,
					v = this.type,
					y = g.tickmarkOffset,
					n = g.chart.renderer,
					D = v ? v + "Grid" :
					"grid",
					r = d[D + "LineWidth"],
					c = d[D + "LineColor"],
					d = d[D + "LineDashStyle"];
				k || (b.stroke = c, b["stroke-width"] = r, d && (b.dashstyle = d), v || (b.zIndex = 1), a && (b.opacity = 0), this.gridLine = k = n.path().attr(b).addClass("highcharts-" + (v ? v + "-" : "") + "grid-line").add(g.gridGroup));
				if(!a && k && (a = g.getPlotLinePath(e + y, k.strokeWidth() * l, a, !0))) k[this.isNew ? "attr" : "animate"]({
					d: a,
					opacity: f
				})
			},
			renderMark: function(a, l, m) {
				var g = this.axis,
					d = g.options,
					k = g.chart.renderer,
					b = this.type,
					e = b ? b + "Tick" : "tick",
					v = g.tickSize(e),
					y = this.mark,
					n = !y,
					D = a.x;
				a = a.y;
				var r = f(d[e + "Width"], !b && g.isXAxis ? 1 : 0),
					d = d[e + "Color"];
				v && (g.opposite && (v[0] = -v[0]), n && (this.mark = y = k.path().addClass("highcharts-" + (b ? b + "-" : "") + "tick").add(g.axisGroup), y.attr({
					stroke: d,
					"stroke-width": r
				})), y[n ? "attr" : "animate"]({
					d: this.getMarkPath(D, a, v[0], y.strokeWidth() * m, g.horiz, k),
					opacity: l
				}))
			},
			renderLabel: function(a, l, m, g) {
				var d = this.axis,
					k = d.horiz,
					b = d.options,
					e = this.label,
					v = b.labels,
					y = v.step,
					n = d.tickmarkOffset,
					D = !0,
					r = a.x;
				a = a.y;
				e && E(r) && (e.xy = a = this.getLabelPosition(r, a, e, k, v, n,
					g, y), this.isFirst && !this.isLast && !f(b.showFirstLabel, 1) || this.isLast && !this.isFirst && !f(b.showLastLabel, 1) ? D = !1 : !k || d.isRadial || v.step || v.rotation || l || 0 === m || this.handleOverflow(a), y && g % y && (D = !1), D && E(a.y) ? (a.opacity = m, e[this.isNewLabel ? "attr" : "animate"](a), this.isNewLabel = !1) : (e.attr("y", -9999), this.isNewLabel = !0), this.isNew = !1)
			},
			render: function(a, l, m) {
				var g = this.axis,
					d = g.horiz,
					k = this.getPosition(d, this.pos, g.tickmarkOffset, l),
					b = k.x,
					e = k.y,
					g = d && b === g.pos + g.len || !d && e === g.pos ? -1 : 1;
				m = f(m, 1);
				this.isActive = !0;
				this.renderGridLine(l, m, g);
				this.renderMark(k, m, g);
				this.renderLabel(k, l, m, a)
			},
			destroy: function() {
				F(this, this.axis)
			}
		}
	})(M);
	var S = function(a) {
		var C = a.addEvent,
			A = a.animObject,
			F = a.arrayMax,
			E = a.arrayMin,
			m = a.color,
			f = a.correctFloat,
			l = a.defaultOptions,
			r = a.defined,
			u = a.deg2rad,
			t = a.destroyObjectProperties,
			g = a.each,
			d = a.extend,
			k = a.fireEvent,
			b = a.format,
			e = a.getMagnitude,
			v = a.grep,
			y = a.inArray,
			n = a.isArray,
			D = a.isNumber,
			J = a.isString,
			c = a.merge,
			G = a.normalizeTickInterval,
			q = a.objectEach,
			B = a.pick,
			K = a.removeEvent,
			p = a.splat,
			z = a.syncTimeout,
			I = a.Tick,
			L = function() {
				this.init.apply(this, arguments)
			};
		a.extend(L.prototype, {
			defaultOptions: {
				dateTimeLabelFormats: {
					millisecond: "%H:%M:%S.%L",
					second: "%H:%M:%S",
					minute: "%H:%M",
					hour: "%H:%M",
					day: "%e. %b",
					week: "%e. %b",
					month: "%b '%y",
					year: "%Y"
				},
				endOnTick: !1,
				labels: {
					enabled: !0,
					style: {
						color: "#666666",
						cursor: "default",
						fontSize: "11px"
					},
					x: 0
				},
				minPadding: .01,
				maxPadding: .01,
				minorTickLength: 2,
				minorTickPosition: "outside",
				startOfWeek: 1,
				startOnTick: !1,
				tickLength: 10,
				tickmarkPlacement: "between",
				tickPixelInterval: 100,
				tickPosition: "outside",
				title: {
					align: "middle",
					style: {
						color: "#666666"
					}
				},
				type: "linear",
				minorGridLineColor: "#f2f2f2",
				minorGridLineWidth: 1,
				minorTickColor: "#999999",
				lineColor: "#ccd6eb",
				lineWidth: 1,
				gridLineColor: "#e6e6e6",
				tickColor: "#ccd6eb"
			},
			defaultYAxisOptions: {
				endOnTick: !0,
				tickPixelInterval: 72,
				showLastLabel: !0,
				labels: {
					x: -8
				},
				maxPadding: .05,
				minPadding: .05,
				startOnTick: !0,
				title: {
					rotation: 270,
					text: "Values"
				},
				stackLabels: {
					allowOverlap: !1,
					enabled: !1,
					formatter: function() {
						return a.numberFormat(this.total, -1)
					},
					style: {
						fontSize: "11px",
						fontWeight: "bold",
						color: "#000000",
						textOutline: "1px contrast"
					}
				},
				gridLineWidth: 1,
				lineWidth: 0
			},
			defaultLeftAxisOptions: {
				labels: {
					x: -15
				},
				title: {
					rotation: 270
				}
			},
			defaultRightAxisOptions: {
				labels: {
					x: 15
				},
				title: {
					rotation: 90
				}
			},
			defaultBottomAxisOptions: {
				labels: {
					autoRotation: [-45],
					x: 0
				},
				title: {
					rotation: 0
				}
			},
			defaultTopAxisOptions: {
				labels: {
					autoRotation: [-45],
					x: 0
				},
				title: {
					rotation: 0
				}
			},
			init: function(a, c) {
				var h = c.isX,
					b = this;
				b.chart = a;
				b.horiz = a.inverted && !b.isZAxis ? !h : h;
				b.isXAxis = h;
				b.coll = b.coll || (h ?
					"xAxis" : "yAxis");
				b.opposite = c.opposite;
				b.side = c.side || (b.horiz ? b.opposite ? 0 : 2 : b.opposite ? 1 : 3);
				b.setOptions(c);
				var w = this.options,
					e = w.type;
				b.labelFormatter = w.labels.formatter || b.defaultLabelFormatter;
				b.userOptions = c;
				b.minPixelPadding = 0;
				b.reversed = w.reversed;
				b.visible = !1 !== w.visible;
				b.zoomEnabled = !1 !== w.zoomEnabled;
				b.hasNames = "category" === e || !0 === w.categories;
				b.categories = w.categories || b.hasNames;
				b.names = b.names || [];
				b.plotLinesAndBandsGroups = {};
				b.isLog = "logarithmic" === e;
				b.isDatetimeAxis = "datetime" ===
					e;
				b.positiveValuesOnly = b.isLog && !b.allowNegativeLog;
				b.isLinked = r(w.linkedTo);
				b.ticks = {};
				b.labelEdge = [];
				b.minorTicks = {};
				b.plotLinesAndBands = [];
				b.alternateBands = {};
				b.len = 0;
				b.minRange = b.userMinRange = w.minRange || w.maxZoom;
				b.range = w.range;
				b.offset = w.offset || 0;
				b.stacks = {};
				b.oldStacks = {};
				b.stacksTouched = 0;
				b.max = null;
				b.min = null;
				b.crosshair = B(w.crosshair, p(a.options.tooltip.crosshairs)[h ? 0 : 1], !1);
				c = b.options.events; - 1 === y(b, a.axes) && (h ? a.axes.splice(a.xAxis.length, 0, b) : a.axes.push(b), a[b.coll].push(b));
				b.series =
					b.series || [];
				a.inverted && !b.isZAxis && h && void 0 === b.reversed && (b.reversed = !0);
				q(c, function(a, h) {
					C(b, h, a)
				});
				b.lin2log = w.linearToLogConverter || b.lin2log;
				b.isLog && (b.val2lin = b.log2lin, b.lin2val = b.lin2log)
			},
			setOptions: function(a) {
				this.options = c(this.defaultOptions, "yAxis" === this.coll && this.defaultYAxisOptions, [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], c(l[this.coll], a))
			},
			defaultLabelFormatter: function() {
				var h = this.axis,
					c = this.value,
					e = h.categories,
					p = this.dateTimeLabelFormat,
					d = l.lang,
					n = d.numericSymbols,
					d = d.numericSymbolMagnitude || 1E3,
					q = n && n.length,
					x, g = h.options.labels.format,
					h = h.isLog ? Math.abs(c) : h.tickInterval;
				if(g) x = b(g, this);
				else if(e) x = c;
				else if(p) x = a.dateFormat(p, c);
				else if(q && 1E3 <= h)
					for(; q-- && void 0 === x;) e = Math.pow(d, q + 1), h >= e && 0 === 10 * c % e && null !== n[q] && 0 !== c && (x = a.numberFormat(c / e, -1) + n[q]);
				void 0 === x && (x = 1E4 <= Math.abs(c) ? a.numberFormat(c, -1) : a.numberFormat(c, -1, void 0, ""));
				return x
			},
			getSeriesExtremes: function() {
				var a =
					this,
					b = a.chart;
				a.hasVisibleSeries = !1;
				a.dataMin = a.dataMax = a.threshold = null;
				a.softThreshold = !a.isXAxis;
				a.buildStacks && a.buildStacks();
				g(a.series, function(h) {
					if(h.visible || !b.options.chart.ignoreHiddenSeries) {
						var c = h.options,
							w = c.threshold,
							e;
						a.hasVisibleSeries = !0;
						a.positiveValuesOnly && 0 >= w && (w = null);
						if(a.isXAxis) c = h.xData, c.length && (h = E(c), D(h) || h instanceof Date || (c = v(c, function(a) {
							return D(a)
						}), h = E(c)), a.dataMin = Math.min(B(a.dataMin, c[0]), h), a.dataMax = Math.max(B(a.dataMax, c[0]), F(c)));
						else if(h.getExtremes(),
							e = h.dataMax, h = h.dataMin, r(h) && r(e) && (a.dataMin = Math.min(B(a.dataMin, h), h), a.dataMax = Math.max(B(a.dataMax, e), e)), r(w) && (a.threshold = w), !c.softThreshold || a.positiveValuesOnly) a.softThreshold = !1
					}
				})
			},
			translate: function(a, b, c, e, p, d) {
				var h = this.linkedParent || this,
					w = 1,
					n = 0,
					q = e ? h.oldTransA : h.transA;
				e = e ? h.oldMin : h.min;
				var g = h.minPixelPadding;
				p = (h.isOrdinal || h.isBroken || h.isLog && p) && h.lin2val;
				q || (q = h.transA);
				c && (w *= -1, n = h.len);
				h.reversed && (w *= -1, n -= w * (h.sector || h.len));
				b ? (a = (a * w + n - g) / q + e, p && (a = h.lin2val(a))) :
					(p && (a = h.val2lin(a)), a = w * (a - e) * q + n + w * g + (D(d) ? q * d : 0));
				return a
			},
			toPixels: function(a, b) {
				return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos)
			},
			toValue: function(a, b) {
				return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0)
			},
			getPlotLinePath: function(a, b, c, e, p) {
				var h = this.chart,
					w = this.left,
					d = this.top,
					n, q, g = c && h.oldChartHeight || h.chartHeight,
					k = c && h.oldChartWidth || h.chartWidth,
					f;
				n = this.transB;
				var v = function(a, h, b) {
					if(a < h || a > b) e ? a = Math.min(Math.max(h, a), b) : f = !0;
					return a
				};
				p = B(p, this.translate(a,
					null, null, c));
				a = c = Math.round(p + n);
				n = q = Math.round(g - p - n);
				D(p) ? this.horiz ? (n = d, q = g - this.bottom, a = c = v(a, w, w + this.width)) : (a = w, c = k - this.right, n = q = v(n, d, d + this.height)) : f = !0;
				return f && !e ? null : h.renderer.crispLine(["M", a, n, "L", c, q], b || 1)
			},
			getLinearTickPositions: function(a, b, c) {
				var h, w = f(Math.floor(b / a) * a);
				c = f(Math.ceil(c / a) * a);
				var e = [];
				if(this.single) return [b];
				for(b = w; b <= c;) {
					e.push(b);
					b = f(b + a);
					if(b === h) break;
					h = b
				}
				return e
			},
			getMinorTickPositions: function() {
				var a = this,
					b = a.options,
					c = a.tickPositions,
					e = a.minorTickInterval,
					p = [],
					d = a.pointRangePadding || 0,
					n = a.min - d,
					d = a.max + d,
					q = d - n;
				if(q && q / e < a.len / 3)
					if(a.isLog) g(this.paddedTicks, function(h, b, c) {
						b && p.push.apply(p, a.getLogTickPositions(e, c[b - 1], c[b], !0))
					});
					else if(a.isDatetimeAxis && "auto" === b.minorTickInterval) p = p.concat(a.getTimeTicks(a.normalizeTimeTickInterval(e), n, d, b.startOfWeek));
				else
					for(b = n + (c[0] - n) % e; b <= d && b !== p[0]; b += e) p.push(b);
				0 !== p.length && a.trimTicks(p);
				return p
			},
			adjustForMinRange: function() {
				var a = this.options,
					b = this.min,
					c = this.max,
					e, p, d, n, q, k, f, v;
				this.isXAxis &&
					void 0 === this.minRange && !this.isLog && (r(a.min) || r(a.max) ? this.minRange = null : (g(this.series, function(a) {
						k = a.xData;
						for(n = f = a.xIncrement ? 1 : k.length - 1; 0 < n; n--)
							if(q = k[n] - k[n - 1], void 0 === d || q < d) d = q
					}), this.minRange = Math.min(5 * d, this.dataMax - this.dataMin)));
				c - b < this.minRange && (p = this.dataMax - this.dataMin >= this.minRange, v = this.minRange, e = (v - c + b) / 2, e = [b - e, B(a.min, b - e)], p && (e[2] = this.isLog ? this.log2lin(this.dataMin) : this.dataMin), b = F(e), c = [b + v, B(a.max, b + v)], p && (c[2] = this.isLog ? this.log2lin(this.dataMax) : this.dataMax),
					c = E(c), c - b < v && (e[0] = c - v, e[1] = B(a.min, c - v), b = F(e)));
				this.min = b;
				this.max = c
			},
			getClosest: function() {
				var a;
				this.categories ? a = 1 : g(this.series, function(h) {
					var b = h.closestPointRange,
						c = h.visible || !h.chart.options.chart.ignoreHiddenSeries;
					!h.noSharedTooltip && r(b) && c && (a = r(a) ? Math.min(a, b) : b)
				});
				return a
			},
			nameToX: function(a) {
				var h = n(this.categories),
					b = h ? this.categories : this.names,
					c = a.options.x,
					e;
				a.series.requireSorting = !1;
				r(c) || (c = !1 === this.options.uniqueNames ? a.series.autoIncrement() : y(a.name, b)); - 1 === c ? h ||
					(e = b.length) : e = c;
				void 0 !== e && (this.names[e] = a.name);
				return e
			},
			updateNames: function() {
				var a = this;
				0 < this.names.length && (this.names.length = 0, this.minRange = this.userMinRange, g(this.series || [], function(h) {
					h.xIncrement = null;
					if(!h.points || h.isDirtyData) h.processData(), h.generatePoints();
					g(h.points, function(b, c) {
						var e;
						b.options && (e = a.nameToX(b), void 0 !== e && e !== b.x && (b.x = e, h.xData[c] = e))
					})
				}))
			},
			setAxisTranslation: function(a) {
				var h = this,
					b = h.max - h.min,
					c = h.axisPointRange || 0,
					e, p = 0,
					d = 0,
					n = h.linkedParent,
					q = !!h.categories,
					k = h.transA,
					f = h.isXAxis;
				if(f || q || c) e = h.getClosest(), n ? (p = n.minPointOffset, d = n.pointRangePadding) : g(h.series, function(a) {
					var b = q ? 1 : f ? B(a.options.pointRange, e, 0) : h.axisPointRange || 0;
					a = a.options.pointPlacement;
					c = Math.max(c, b);
					h.single || (p = Math.max(p, J(a) ? 0 : b / 2), d = Math.max(d, "on" === a ? 0 : b))
				}), n = h.ordinalSlope && e ? h.ordinalSlope / e : 1, h.minPointOffset = p *= n, h.pointRangePadding = d *= n, h.pointRange = Math.min(c, b), f && (h.closestPointRange = e);
				a && (h.oldTransA = k);
				h.translationSlope = h.transA = k = h.options.staticScale || h.len /
					(b + d || 1);
				h.transB = h.horiz ? h.left : h.bottom;
				h.minPixelPadding = k * p
			},
			minFromRange: function() {
				return this.max - this.range
			},
			setTickInterval: function(h) {
				var b = this,
					c = b.chart,
					p = b.options,
					d = b.isLog,
					n = b.log2lin,
					q = b.isDatetimeAxis,
					x = b.isXAxis,
					v = b.isLinked,
					z = p.maxPadding,
					y = p.minPadding,
					l = p.tickInterval,
					I = p.tickPixelInterval,
					m = b.categories,
					J = b.threshold,
					t = b.softThreshold,
					L, u, K, A;
				q || m || v || this.getTickAmount();
				K = B(b.userMin, p.min);
				A = B(b.userMax, p.max);
				v ? (b.linkedParent = c[b.coll][p.linkedTo], c = b.linkedParent.getExtremes(),
					b.min = B(c.min, c.dataMin), b.max = B(c.max, c.dataMax), p.type !== b.linkedParent.options.type && a.error(11, 1)) : (!t && r(J) && (b.dataMin >= J ? (L = J, y = 0) : b.dataMax <= J && (u = J, z = 0)), b.min = B(K, L, b.dataMin), b.max = B(A, u, b.dataMax));
				d && (b.positiveValuesOnly && !h && 0 >= Math.min(b.min, B(b.dataMin, b.min)) && a.error(10, 1), b.min = f(n(b.min), 15), b.max = f(n(b.max), 15));
				b.range && r(b.max) && (b.userMin = b.min = K = Math.max(b.dataMin, b.minFromRange()), b.userMax = A = b.max, b.range = null);
				k(b, "foundExtremes");
				b.beforePadding && b.beforePadding();
				b.adjustForMinRange();
				!(m || b.axisPointRange || b.usePercentage || v) && r(b.min) && r(b.max) && (n = b.max - b.min) && (!r(K) && y && (b.min -= n * y), !r(A) && z && (b.max += n * z));
				D(p.softMin) && (b.min = Math.min(b.min, p.softMin));
				D(p.softMax) && (b.max = Math.max(b.max, p.softMax));
				D(p.floor) && (b.min = Math.max(b.min, p.floor));
				D(p.ceiling) && (b.max = Math.min(b.max, p.ceiling));
				t && r(b.dataMin) && (J = J || 0, !r(K) && b.min < J && b.dataMin >= J ? b.min = J : !r(A) && b.max > J && b.dataMax <= J && (b.max = J));
				b.tickInterval = b.min === b.max || void 0 === b.min || void 0 === b.max ? 1 : v && !l && I === b.linkedParent.options.tickPixelInterval ?
					l = b.linkedParent.tickInterval : B(l, this.tickAmount ? (b.max - b.min) / Math.max(this.tickAmount - 1, 1) : void 0, m ? 1 : (b.max - b.min) * I / Math.max(b.len, I));
				x && !h && g(b.series, function(a) {
					a.processData(b.min !== b.oldMin || b.max !== b.oldMax)
				});
				b.setAxisTranslation(!0);
				b.beforeSetTickPositions && b.beforeSetTickPositions();
				b.postProcessTickInterval && (b.tickInterval = b.postProcessTickInterval(b.tickInterval));
				b.pointRange && !l && (b.tickInterval = Math.max(b.pointRange, b.tickInterval));
				h = B(p.minTickInterval, b.isDatetimeAxis && b.closestPointRange);
				!l && b.tickInterval < h && (b.tickInterval = h);
				q || d || l || (b.tickInterval = G(b.tickInterval, null, e(b.tickInterval), B(p.allowDecimals, !(.5 < b.tickInterval && 5 > b.tickInterval && 1E3 < b.max && 9999 > b.max)), !!this.tickAmount));
				this.tickAmount || (b.tickInterval = b.unsquish());
				this.setTickPositions()
			},
			setTickPositions: function() {
				var a = this.options,
					b, c = a.tickPositions,
					e = a.tickPositioner,
					p = a.startOnTick,
					d = a.endOnTick;
				this.tickmarkOffset = this.categories && "between" === a.tickmarkPlacement && 1 === this.tickInterval ? .5 : 0;
				this.minorTickInterval =
					"auto" === a.minorTickInterval && this.tickInterval ? this.tickInterval / 5 : a.minorTickInterval;
				this.single = this.min === this.max && r(this.min) && !this.tickAmount && (parseInt(this.min, 10) === this.min || !1 !== a.allowDecimals);
				this.tickPositions = b = c && c.slice();
				!b && (b = this.isDatetimeAxis ? this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, a.units), this.min, this.max, a.startOfWeek, this.ordinalPositions, this.closestPointRange, !0) : this.isLog ? this.getLogTickPositions(this.tickInterval, this.min, this.max) : this.getLinearTickPositions(this.tickInterval,
					this.min, this.max), b.length > this.len && (b = [b[0], b.pop()]), this.tickPositions = b, e && (e = e.apply(this, [this.min, this.max]))) && (this.tickPositions = b = e);
				this.paddedTicks = b.slice(0);
				this.trimTicks(b, p, d);
				this.isLinked || (this.single && 2 > b.length && (this.min -= .5, this.max += .5), c || e || this.adjustTickAmount())
			},
			trimTicks: function(a, b, c) {
				var h = a[0],
					e = a[a.length - 1],
					p = this.minPointOffset || 0;
				if(!this.isLinked) {
					if(b && -Infinity !== h) this.min = h;
					else
						for(; this.min - p > a[0];) a.shift();
					if(c) this.max = e;
					else
						for(; this.max + p < a[a.length -
								1];) a.pop();
					0 === a.length && r(h) && a.push((e + h) / 2)
				}
			},
			alignToOthers: function() {
				var a = {},
					b, c = this.options;
				!1 === this.chart.options.chart.alignTicks || !1 === c.alignTicks || this.isLog || g(this.chart[this.coll], function(h) {
					var c = h.options,
						c = [h.horiz ? c.left : c.top, c.width, c.height, c.pane].join();
					h.series.length && (a[c] ? b = !0 : a[c] = 1)
				});
				return b
			},
			getTickAmount: function() {
				var a = this.options,
					b = a.tickAmount,
					c = a.tickPixelInterval;
				!r(a.tickInterval) && this.len < c && !this.isRadial && !this.isLog && a.startOnTick && a.endOnTick && (b =
					2);
				!b && this.alignToOthers() && (b = Math.ceil(this.len / c) + 1);
				4 > b && (this.finalTickAmt = b, b = 5);
				this.tickAmount = b
			},
			adjustTickAmount: function() {
				var a = this.tickInterval,
					b = this.tickPositions,
					c = this.tickAmount,
					e = this.finalTickAmt,
					p = b && b.length;
				if(p < c) {
					for(; b.length < c;) b.push(f(b[b.length - 1] + a));
					this.transA *= (p - 1) / (c - 1);
					this.max = b[b.length - 1]
				} else p > c && (this.tickInterval *= 2, this.setTickPositions());
				if(r(e)) {
					for(a = c = b.length; a--;)(3 === e && 1 === a % 2 || 2 >= e && 0 < a && a < c - 1) && b.splice(a, 1);
					this.finalTickAmt = void 0
				}
			},
			setScale: function() {
				var a,
					b;
				this.oldMin = this.min;
				this.oldMax = this.max;
				this.oldAxisLength = this.len;
				this.setAxisSize();
				b = this.len !== this.oldAxisLength;
				g(this.series, function(b) {
					if(b.isDirtyData || b.isDirty || b.xAxis.isDirty) a = !0
				});
				b || a || this.isLinked || this.forceRedraw || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax || this.alignToOthers() ? (this.resetStacks && this.resetStacks(), this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickInterval(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, this.isDirty ||
					(this.isDirty = b || this.min !== this.oldMin || this.max !== this.oldMax)) : this.cleanStacks && this.cleanStacks()
			},
			setExtremes: function(a, b, c, e, p) {
				var h = this,
					n = h.chart;
				c = B(c, !0);
				g(h.series, function(a) {
					delete a.kdTree
				});
				p = d(p, {
					min: a,
					max: b
				});
				k(h, "setExtremes", p, function() {
					h.userMin = a;
					h.userMax = b;
					h.eventArgs = p;
					c && n.redraw(e)
				})
			},
			zoom: function(a, b) {
				var h = this.dataMin,
					c = this.dataMax,
					e = this.options,
					p = Math.min(h, B(e.min, h)),
					e = Math.max(c, B(e.max, c));
				if(a !== this.min || b !== this.max) this.allowZoomOutside || (r(h) && (a < p && (a =
					p), a > e && (a = e)), r(c) && (b < p && (b = p), b > e && (b = e))), this.displayBtn = void 0 !== a || void 0 !== b, this.setExtremes(a, b, !1, void 0, {
					trigger: "zoom"
				});
				return !0
			},
			setAxisSize: function() {
				var b = this.chart,
					c = this.options,
					e = c.offsets || [0, 0, 0, 0],
					p = this.horiz,
					d = this.width = Math.round(a.relativeLength(B(c.width, b.plotWidth - e[3] + e[1]), b.plotWidth)),
					n = this.height = Math.round(a.relativeLength(B(c.height, b.plotHeight - e[0] + e[2]), b.plotHeight)),
					q = this.top = Math.round(a.relativeLength(B(c.top, b.plotTop + e[0]), b.plotHeight, b.plotTop)),
					c = this.left = Math.round(a.relativeLength(B(c.left, b.plotLeft + e[3]), b.plotWidth, b.plotLeft));
				this.bottom = b.chartHeight - n - q;
				this.right = b.chartWidth - d - c;
				this.len = Math.max(p ? d : n, 0);
				this.pos = p ? c : q
			},
			getExtremes: function() {
				var a = this.isLog,
					b = this.lin2log;
				return {
					min: a ? f(b(this.min)) : this.min,
					max: a ? f(b(this.max)) : this.max,
					dataMin: this.dataMin,
					dataMax: this.dataMax,
					userMin: this.userMin,
					userMax: this.userMax
				}
			},
			getThreshold: function(a) {
				var b = this.isLog,
					h = this.lin2log,
					c = b ? h(this.min) : this.min,
					b = b ? h(this.max) : this.max;
				null === a ? a = c : c > a ? a = c : b < a && (a = b);
				return this.translate(a, 0, 1, 0, 1)
			},
			autoLabelAlign: function(a) {
				a = (B(a, 0) - 90 * this.side + 720) % 360;
				return 15 < a && 165 > a ? "right" : 195 < a && 345 > a ? "left" : "center"
			},
			tickSize: function(a) {
				var b = this.options,
					h = b[a + "Length"],
					c = B(b[a + "Width"], "tick" === a && this.isXAxis ? 1 : 0);
				if(c && h) return "inside" === b[a + "Position"] && (h = -h), [h, c]
			},
			labelMetrics: function() {
				var a = this.tickPositions && this.tickPositions[0] || 0;
				return this.chart.renderer.fontMetrics(this.options.labels.style && this.options.labels.style.fontSize,
					this.ticks[a] && this.ticks[a].label)
			},
			unsquish: function() {
				var a = this.options.labels,
					b = this.horiz,
					c = this.tickInterval,
					e = c,
					p = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / c),
					d, n = a.rotation,
					q = this.labelMetrics(),
					k, f = Number.MAX_VALUE,
					v, z = function(a) {
						a /= p || 1;
						a = 1 < a ? Math.ceil(a) : 1;
						return a * c
					};
				b ? (v = !a.staggerLines && !a.step && (r(n) ? [n] : p < B(a.autoRotationLimit, 80) && a.autoRotation)) && g(v, function(a) {
						var b;
						if(a === n || a && -90 <= a && 90 >= a) k = z(Math.abs(q.h / Math.sin(u * a))), b = k + Math.abs(a / 360), b < f && (f = b, d = a, e = k)
					}) :
					a.step || (e = z(q.h));
				this.autoRotation = v;
				this.labelRotation = B(d, n);
				return e
			},
			getSlotWidth: function() {
				var a = this.chart,
					b = this.horiz,
					c = this.options.labels,
					e = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),
					p = a.margin[3];
				return b && 2 > (c.step || 0) && !c.rotation && (this.staggerLines || 1) * this.len / e || !b && (p && p - a.spacing[3] || .33 * a.chartWidth)
			},
			renderUnsquish: function() {
				var a = this.chart,
					b = a.renderer,
					e = this.tickPositions,
					p = this.ticks,
					d = this.options.labels,
					n = this.horiz,
					q = this.getSlotWidth(),
					k = Math.max(1,
						Math.round(q - 2 * (d.padding || 5))),
					f = {},
					v = this.labelMetrics(),
					z = d.style && d.style.textOverflow,
					D, y = 0,
					l, I;
				J(d.rotation) || (f.rotation = d.rotation || 0);
				g(e, function(a) {
					(a = p[a]) && a.labelLength > y && (y = a.labelLength)
				});
				this.maxLabelLength = y;
				if(this.autoRotation) y > k && y > v.h ? f.rotation = this.labelRotation : this.labelRotation = 0;
				else if(q && (D = {
						width: k + "px"
					}, !z))
					for(D.textOverflow = "clip", l = e.length; !n && l--;)
						if(I = e[l], k = p[I].label) k.styles && "ellipsis" === k.styles.textOverflow ? k.css({
								textOverflow: "clip"
							}) : p[I].labelLength >
							q && k.css({
								width: q + "px"
							}), k.getBBox().height > this.len / e.length - (v.h - v.f) && (k.specCss = {
								textOverflow: "ellipsis"
							});
				f.rotation && (D = {
					width: (y > .5 * a.chartHeight ? .33 * a.chartHeight : a.chartHeight) + "px"
				}, z || (D.textOverflow = "ellipsis"));
				if(this.labelAlign = d.align || this.autoLabelAlign(this.labelRotation)) f.align = this.labelAlign;
				g(e, function(a) {
					var b = (a = p[a]) && a.label;
					b && (b.attr(f), D && b.css(c(D, b.specCss)), delete b.specCss, a.rotation = f.rotation)
				});
				this.tickRotCorr = b.rotCorr(v.b, this.labelRotation || 0, 0 !== this.side)
			},
			hasData: function() {
				return this.hasVisibleSeries || r(this.min) && r(this.max) && !!this.tickPositions
			},
			addTitle: function(a) {
				var b = this.chart.renderer,
					c = this.horiz,
					h = this.opposite,
					e = this.options.title,
					p;
				this.axisTitle || ((p = e.textAlign) || (p = (c ? {
						low: "left",
						middle: "center",
						high: "right"
					} : {
						low: h ? "right" : "left",
						middle: "center",
						high: h ? "left" : "right"
					})[e.align]), this.axisTitle = b.text(e.text, 0, 0, e.useHTML).attr({
						zIndex: 7,
						rotation: e.rotation || 0,
						align: p
					}).addClass("highcharts-axis-title").css(e.style).add(this.axisGroup),
					this.axisTitle.isNew = !0);
				e.style.width || this.isRadial || this.axisTitle.css({
					width: this.len
				});
				this.axisTitle[a ? "show" : "hide"](!0)
			},
			generateTick: function(a) {
				var b = this.ticks;
				b[a] ? b[a].addLabel() : b[a] = new I(this, a)
			},
			getOffset: function() {
				var a = this,
					b = a.chart,
					c = b.renderer,
					e = a.options,
					p = a.tickPositions,
					d = a.ticks,
					n = a.horiz,
					k = a.side,
					f = b.inverted && !a.isZAxis ? [1, 0, 3, 2][k] : k,
					v, z, D = 0,
					y, l = 0,
					I = e.title,
					m = e.labels,
					G = 0,
					J = b.axisOffset,
					b = b.clipOffset,
					t = [-1, 1, 1, -1][k],
					L = e.className,
					u = a.axisParent,
					K = this.tickSize("tick");
				v = a.hasData();
				a.showAxis = z = v || B(e.showEmpty, !0);
				a.staggerLines = a.horiz && m.staggerLines;
				a.axisGroup || (a.gridGroup = c.g("grid").attr({
					zIndex: e.gridZIndex || 1
				}).addClass("highcharts-" + this.coll.toLowerCase() + "-grid " + (L || "")).add(u), a.axisGroup = c.g("axis").attr({
					zIndex: e.zIndex || 2
				}).addClass("highcharts-" + this.coll.toLowerCase() + " " + (L || "")).add(u), a.labelGroup = c.g("axis-labels").attr({
					zIndex: m.zIndex || 7
				}).addClass("highcharts-" + a.coll.toLowerCase() + "-labels " + (L || "")).add(u));
				v || a.isLinked ? (g(p, function(b,
					c) {
					a.generateTick(b, c)
				}), a.renderUnsquish(), !1 === m.reserveSpace || 0 !== k && 2 !== k && {
					1: "left",
					3: "right"
				}[k] !== a.labelAlign && "center" !== a.labelAlign || g(p, function(a) {
					G = Math.max(d[a].getLabelSize(), G)
				}), a.staggerLines && (G *= a.staggerLines, a.labelOffset = G * (a.opposite ? -1 : 1))) : q(d, function(a, b) {
					a.destroy();
					delete d[b]
				});
				I && I.text && !1 !== I.enabled && (a.addTitle(z), z && !1 !== I.reserveSpace && (a.titleOffset = D = a.axisTitle.getBBox()[n ? "height" : "width"], y = I.offset, l = r(y) ? 0 : B(I.margin, n ? 5 : 10)));
				a.renderLine();
				a.offset =
					t * B(e.offset, J[k]);
				a.tickRotCorr = a.tickRotCorr || {
					x: 0,
					y: 0
				};
				c = 0 === k ? -a.labelMetrics().h : 2 === k ? a.tickRotCorr.y : 0;
				l = Math.abs(G) + l;
				G && (l = l - c + t * (n ? B(m.y, a.tickRotCorr.y + 8 * t) : m.x));
				a.axisTitleMargin = B(y, l);
				J[k] = Math.max(J[k], a.axisTitleMargin + D + t * a.offset, l, v && p.length && K ? K[0] + t * a.offset : 0);
				p = 2 * Math.floor(a.axisLine.strokeWidth() / 2);
				0 < e.offset && (p -= 2 * e.offset);
				b[f] = Math.max(b[f] || p, p)
			},
			getLinePath: function(a) {
				var b = this.chart,
					c = this.opposite,
					h = this.offset,
					e = this.horiz,
					p = this.left + (c ? this.width : 0) + h,
					h = b.chartHeight -
					this.bottom - (c ? this.height : 0) + h;
				c && (a *= -1);
				return b.renderer.crispLine(["M", e ? this.left : p, e ? h : this.top, "L", e ? b.chartWidth - this.right : p, e ? h : b.chartHeight - this.bottom], a)
			},
			renderLine: function() {
				this.axisLine || (this.axisLine = this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup), this.axisLine.attr({
					stroke: this.options.lineColor,
					"stroke-width": this.options.lineWidth,
					zIndex: 7
				}))
			},
			getTitlePosition: function() {
				var a = this.horiz,
					b = this.left,
					c = this.top,
					e = this.len,
					p = this.options.title,
					d = a ? b : c,
					n = this.opposite,
					q = this.offset,
					k = p.x || 0,
					g = p.y || 0,
					f = this.axisTitle,
					v = this.chart.renderer.fontMetrics(p.style && p.style.fontSize, f),
					f = Math.max(f.getBBox(null, 0).height - v.h - 1, 0),
					e = {
						low: d + (a ? 0 : e),
						middle: d + e / 2,
						high: d + (a ? e : 0)
					}[p.align],
					b = (a ? c + this.height : b) + (a ? 1 : -1) * (n ? -1 : 1) * this.axisTitleMargin + [-f, f, v.f, -f][this.side];
				return {
					x: a ? e + k : b + (n ? this.width : 0) + q + k,
					y: a ? b + g - (n ? this.height : 0) + q : e + g
				}
			},
			renderMinorTick: function(a) {
				var b = this.chart.hasRendered && D(this.oldMin),
					c = this.minorTicks;
				c[a] || (c[a] = new I(this,
					a, "minor"));
				b && c[a].isNew && c[a].render(null, !0);
				c[a].render(null, !1, 1)
			},
			renderTick: function(a, b) {
				var c = this.isLinked,
					e = this.ticks,
					h = this.chart.hasRendered && D(this.oldMin);
				if(!c || a >= this.min && a <= this.max) e[a] || (e[a] = new I(this, a)), h && e[a].isNew && e[a].render(b, !0, .1), e[a].render(b)
			},
			render: function() {
				var b = this,
					c = b.chart,
					e = b.options,
					p = b.isLog,
					d = b.lin2log,
					n = b.isLinked,
					k = b.tickPositions,
					f = b.axisTitle,
					v = b.ticks,
					y = b.minorTicks,
					l = b.alternateBands,
					m = e.stackLabels,
					r = e.alternateGridColor,
					B = b.tickmarkOffset,
					G = b.axisLine,
					J = b.showAxis,
					t = A(c.renderer.globalAnimation),
					L, u;
				b.labelEdge.length = 0;
				b.overlap = !1;
				g([v, y, l], function(a) {
					q(a, function(a) {
						a.isActive = !1
					})
				});
				if(b.hasData() || n) b.minorTickInterval && !b.categories && g(b.getMinorTickPositions(), function(a) {
					b.renderMinorTick(a)
				}), k.length && (g(k, function(a, c) {
					b.renderTick(a, c)
				}), B && (0 === b.min || b.single) && (v[-1] || (v[-1] = new I(b, -1, null, !0)), v[-1].render(-1))), r && g(k, function(e, h) {
					u = void 0 !== k[h + 1] ? k[h + 1] + B : b.max - B;
					0 === h % 2 && e < b.max && u <= b.max + (c.polar ? -B : B) && (l[e] ||
						(l[e] = new a.PlotLineOrBand(b)), L = e + B, l[e].options = {
							from: p ? d(L) : L,
							to: p ? d(u) : u,
							color: r
						}, l[e].render(), l[e].isActive = !0)
				}), b._addedPlotLB || (g((e.plotLines || []).concat(e.plotBands || []), function(a) {
					b.addPlotBandOrLine(a)
				}), b._addedPlotLB = !0);
				g([v, y, l], function(a) {
					var b, e = [],
						h = t.duration;
					q(a, function(a, b) {
						a.isActive || (a.render(b, !1, 0), a.isActive = !1, e.push(b))
					});
					z(function() {
						for(b = e.length; b--;) a[e[b]] && !a[e[b]].isActive && (a[e[b]].destroy(), delete a[e[b]])
					}, a !== l && c.hasRendered && h ? h : 0)
				});
				G && (G[G.isPlaced ?
					"animate" : "attr"]({
					d: this.getLinePath(G.strokeWidth())
				}), G.isPlaced = !0, G[J ? "show" : "hide"](!0));
				f && J && (e = b.getTitlePosition(), D(e.y) ? (f[f.isNew ? "attr" : "animate"](e), f.isNew = !1) : (f.attr("y", -9999), f.isNew = !0));
				m && m.enabled && b.renderStackTotals();
				b.isDirty = !1
			},
			redraw: function() {
				this.visible && (this.render(), g(this.plotLinesAndBands, function(a) {
					a.render()
				}));
				g(this.series, function(a) {
					a.isDirty = !0
				})
			},
			keepProps: "extKey hcEvents names series userMax userMin".split(" "),
			destroy: function(a) {
				var b = this,
					c = b.stacks,
					e = b.plotLinesAndBands,
					h;
				a || K(b);
				q(c, function(a, b) {
					t(a);
					c[b] = null
				});
				g([b.ticks, b.minorTicks, b.alternateBands], function(a) {
					t(a)
				});
				if(e)
					for(a = e.length; a--;) e[a].destroy();
				g("stackTotalGroup axisLine axisTitle axisGroup gridGroup labelGroup cross".split(" "), function(a) {
					b[a] && (b[a] = b[a].destroy())
				});
				for(h in b.plotLinesAndBandsGroups) b.plotLinesAndBandsGroups[h] = b.plotLinesAndBandsGroups[h].destroy();
				q(b, function(a, c) {
					-1 === y(c, b.keepProps) && delete b[c]
				})
			},
			drawCrosshair: function(a, b) {
				var c, e = this.crosshair,
					h = B(e.snap, !0),
					p, d = this.cross;
				a || (a = this.cross && this.cross.e);
				this.crosshair && !1 !== (r(b) || !h) ? (h ? r(b) && (p = this.isXAxis ? b.plotX : this.len - b.plotY) : p = a && (this.horiz ? a.chartX - this.pos : this.len - a.chartY + this.pos), r(p) && (c = this.getPlotLinePath(b && (this.isXAxis ? b.x : B(b.stackY, b.y)), null, null, null, p) || null), r(c) ? (b = this.categories && !this.isRadial, d || (this.cross = d = this.chart.renderer.path().addClass("highcharts-crosshair highcharts-crosshair-" + (b ? "category " : "thin ") + e.className).attr({
						zIndex: B(e.zIndex, 2)
					}).add(),
					d.attr({
						stroke: e.color || (b ? m("#ccd6eb").setOpacity(.25).get() : "#cccccc"),
						"stroke-width": B(e.width, 1)
					}), e.dashStyle && d.attr({
						dashstyle: e.dashStyle
					})), d.show().attr({
					d: c
				}), b && !e.width && d.attr({
					"stroke-width": this.transA
				}), this.cross.e = a) : this.hideCrosshair()) : this.hideCrosshair()
			},
			hideCrosshair: function() {
				this.cross && this.cross.hide()
			}
		});
		return a.Axis = L
	}(M);
	(function(a) {
		var C = a.Axis,
			A = a.Date,
			F = a.dateFormat,
			E = a.defaultOptions,
			m = a.defined,
			f = a.each,
			l = a.extend,
			r = a.getMagnitude,
			u = a.getTZOffset,
			t = a.normalizeTickInterval,
			g = a.pick,
			d = a.timeUnits;
		C.prototype.getTimeTicks = function(a, b, e, v) {
			var k = [],
				n = {},
				D = E.global.useUTC,
				r, c = new A(b - Math.max(u(b), u(e))),
				G = A.hcMakeTime,
				q = a.unitRange,
				B = a.count,
				t, p;
			if(m(b)) {
				c[A.hcSetMilliseconds](q >= d.second ? 0 : B * Math.floor(c.getMilliseconds() / B));
				if(q >= d.second) c[A.hcSetSeconds](q >= d.minute ? 0 : B * Math.floor(c.getSeconds() / B));
				if(q >= d.minute) c[A.hcSetMinutes](q >= d.hour ? 0 : B * Math.floor(c[A.hcGetMinutes]() / B));
				if(q >= d.hour) c[A.hcSetHours](q >= d.day ? 0 : B * Math.floor(c[A.hcGetHours]() / B));
				if(q >= d.day) c[A.hcSetDate](q >=
					d.month ? 1 : B * Math.floor(c[A.hcGetDate]() / B));
				q >= d.month && (c[A.hcSetMonth](q >= d.year ? 0 : B * Math.floor(c[A.hcGetMonth]() / B)), r = c[A.hcGetFullYear]());
				if(q >= d.year) c[A.hcSetFullYear](r - r % B);
				if(q === d.week) c[A.hcSetDate](c[A.hcGetDate]() - c[A.hcGetDay]() + g(v, 1));
				r = c[A.hcGetFullYear]();
				v = c[A.hcGetMonth]();
				var z = c[A.hcGetDate](),
					I = c[A.hcGetHours]();
				if(A.hcTimezoneOffset || A.hcGetTimezoneOffset) p = (!D || !!A.hcGetTimezoneOffset) && (e - b > 4 * d.month || u(b) !== u(e)), c = c.getTime(), t = u(c), c = new A(c + t);
				D = c.getTime();
				for(b = 1; D <
					e;) k.push(D), D = q === d.year ? G(r + b * B, 0) : q === d.month ? G(r, v + b * B) : !p || q !== d.day && q !== d.week ? p && q === d.hour ? G(r, v, z, I + b * B, 0, 0, t) - t : D + q * B : G(r, v, z + b * B * (q === d.day ? 1 : 7)), b++;
				k.push(D);
				q <= d.hour && 1E4 > k.length && f(k, function(a) {
					0 === a % 18E5 && "000000000" === F("%H%M%S%L", a) && (n[a] = "day")
				})
			}
			k.info = l(a, {
				higherRanks: n,
				totalRange: q * B
			});
			return k
		};
		C.prototype.normalizeTimeTickInterval = function(a, b) {
			var e = b || [
				["millisecond", [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]],
				["second", [1, 2, 5, 10, 15, 30]],
				["minute", [1, 2, 5, 10, 15, 30]],
				["hour", [1,
					2, 3, 4, 6, 8, 12
				]],
				["day", [1, 2]],
				["week", [1, 2]],
				["month", [1, 2, 3, 4, 6]],
				["year", null]
			];
			b = e[e.length - 1];
			var k = d[b[0]],
				g = b[1],
				n;
			for(n = 0; n < e.length && !(b = e[n], k = d[b[0]], g = b[1], e[n + 1] && a <= (k * g[g.length - 1] + d[e[n + 1][0]]) / 2); n++);
			k === d.year && a < 5 * k && (g = [1, 2, 5]);
			a = t(a / k, g, "year" === b[0] ? Math.max(r(a / k), 1) : 1);
			return {
				unitRange: k,
				count: a,
				unitName: b[0]
			}
		}
	})(M);
	(function(a) {
		var C = a.Axis,
			A = a.getMagnitude,
			F = a.map,
			E = a.normalizeTickInterval,
			m = a.pick;
		C.prototype.getLogTickPositions = function(a, l, r, u) {
			var f = this.options,
				g = this.len,
				d = this.lin2log,
				k = this.log2lin,
				b = [];
			u || (this._minorAutoInterval = null);
			if(.5 <= a) a = Math.round(a), b = this.getLinearTickPositions(a, l, r);
			else if(.08 <= a)
				for(var g = Math.floor(l), e, v, y, n, D, f = .3 < a ? [1, 2, 4] : .15 < a ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; g < r + 1 && !D; g++)
					for(v = f.length, e = 0; e < v && !D; e++) y = k(d(g) * f[e]), y > l && (!u || n <= r) && void 0 !== n && b.push(n), n > r && (D = !0), n = y;
			else l = d(l), r = d(r), a = f[u ? "minorTickInterval" : "tickInterval"], a = m("auto" === a ? null : a, this._minorAutoInterval, f.tickPixelInterval / (u ? 5 : 1) * (r - l) / ((u ? g / this.tickPositions.length :
				g) || 1)), a = E(a, null, A(a)), b = F(this.getLinearTickPositions(a, l, r), k), u || (this._minorAutoInterval = a / 5);
			u || (this.tickInterval = a);
			return b
		};
		C.prototype.log2lin = function(a) {
			return Math.log(a) / Math.LN10
		};
		C.prototype.lin2log = function(a) {
			return Math.pow(10, a)
		}
	})(M);
	(function(a, C) {
		var A = a.arrayMax,
			F = a.arrayMin,
			E = a.defined,
			m = a.destroyObjectProperties,
			f = a.each,
			l = a.erase,
			r = a.merge,
			u = a.pick;
		a.PlotLineOrBand = function(a, g) {
			this.axis = a;
			g && (this.options = g, this.id = g.id)
		};
		a.PlotLineOrBand.prototype = {
			render: function() {
				var f =
					this,
					g = f.axis,
					d = g.horiz,
					k = f.options,
					b = k.label,
					e = f.label,
					v = k.to,
					l = k.from,
					n = k.value,
					D = E(l) && E(v),
					m = E(n),
					c = f.svgElem,
					G = !c,
					q = [],
					B = k.color,
					K = u(k.zIndex, 0),
					p = k.events,
					q = {
						"class": "highcharts-plot-" + (D ? "band " : "line ") + (k.className || "")
					},
					z = {},
					I = g.chart.renderer,
					L = D ? "bands" : "lines",
					h = g.log2lin;
				g.isLog && (l = h(l), v = h(v), n = h(n));
				m ? (q = {
					stroke: B,
					"stroke-width": k.width
				}, k.dashStyle && (q.dashstyle = k.dashStyle)) : D && (B && (q.fill = B), k.borderWidth && (q.stroke = k.borderColor, q["stroke-width"] = k.borderWidth));
				z.zIndex = K;
				L +=
					"-" + K;
				(B = g.plotLinesAndBandsGroups[L]) || (g.plotLinesAndBandsGroups[L] = B = I.g("plot-" + L).attr(z).add());
				G && (f.svgElem = c = I.path().attr(q).add(B));
				if(m) q = g.getPlotLinePath(n, c.strokeWidth());
				else if(D) q = g.getPlotBandPath(l, v, k);
				else return;
				G && q && q.length ? (c.attr({
					d: q
				}), p && a.objectEach(p, function(a, b) {
					c.on(b, function(a) {
						p[b].apply(f, [a])
					})
				})) : c && (q ? (c.show(), c.animate({
					d: q
				})) : (c.hide(), e && (f.label = e = e.destroy())));
				b && E(b.text) && q && q.length && 0 < g.width && 0 < g.height && !q.flat ? (b = r({
					align: d && D && "center",
					x: d ?
						!D && 4 : 10,
					verticalAlign: !d && D && "middle",
					y: d ? D ? 16 : 10 : D ? 6 : -4,
					rotation: d && !D && 90
				}, b), this.renderLabel(b, q, D, K)) : e && e.hide();
				return f
			},
			renderLabel: function(a, g, d, k) {
				var b = this.label,
					e = this.axis.chart.renderer;
				b || (b = {
					align: a.textAlign || a.align,
					rotation: a.rotation,
					"class": "highcharts-plot-" + (d ? "band" : "line") + "-label " + (a.className || "")
				}, b.zIndex = k, this.label = b = e.text(a.text, 0, 0, a.useHTML).attr(b).add(), b.css(a.style));
				k = [g[1], g[4], d ? g[6] : g[1]];
				g = [g[2], g[5], d ? g[7] : g[2]];
				d = F(k);
				e = F(g);
				b.align(a, !1, {
					x: d,
					y: e,
					width: A(k) - d,
					height: A(g) - e
				});
				b.show()
			},
			destroy: function() {
				l(this.axis.plotLinesAndBands, this);
				delete this.axis;
				m(this)
			}
		};
		a.extend(C.prototype, {
			getPlotBandPath: function(a, g) {
				var d = this.getPlotLinePath(g, null, null, !0),
					k = this.getPlotLinePath(a, null, null, !0),
					b = this.horiz,
					e = 1;
				a = a < this.min && g < this.min || a > this.max && g > this.max;
				k && d ? (a && (k.flat = k.toString() === d.toString(), e = 0), k.push(b && d[4] === k[4] ? d[4] + e : d[4], b || d[5] !== k[5] ? d[5] : d[5] + e, b && d[1] === k[1] ? d[1] + e : d[1], b || d[2] !== k[2] ? d[2] : d[2] + e)) : k = null;
				return k
			},
			addPlotBand: function(a) {
				return this.addPlotBandOrLine(a, "plotBands")
			},
			addPlotLine: function(a) {
				return this.addPlotBandOrLine(a, "plotLines")
			},
			addPlotBandOrLine: function(f, g) {
				var d = (new a.PlotLineOrBand(this, f)).render(),
					k = this.userOptions;
				d && (g && (k[g] = k[g] || [], k[g].push(f)), this.plotLinesAndBands.push(d));
				return d
			},
			removePlotBandOrLine: function(a) {
				for(var g = this.plotLinesAndBands, d = this.options, k = this.userOptions, b = g.length; b--;) g[b].id === a && g[b].destroy();
				f([d.plotLines || [], k.plotLines || [], d.plotBands || [], k.plotBands || []], function(e) {
					for(b = e.length; b--;) e[b].id === a && l(e, e[b])
				})
			},
			removePlotBand: function(a) {
				this.removePlotBandOrLine(a)
			},
			removePlotLine: function(a) {
				this.removePlotBandOrLine(a)
			}
		})
	})(M, S);
	(function(a) {
		var C = a.dateFormat,
			A = a.each,
			F = a.extend,
			E = a.format,
			m = a.isNumber,
			f = a.map,
			l = a.merge,
			r = a.pick,
			u = a.splat,
			t = a.syncTimeout,
			g = a.timeUnits;
		a.Tooltip = function() {
			this.init.apply(this, arguments)
		};
		a.Tooltip.prototype = {
			init: function(a, k) {
				this.chart = a;
				this.options = k;
				this.crosshairs = [];
				this.now = {
					x: 0,
					y: 0
				};
				this.isHidden = !0;
				this.split = k.split && !a.inverted;
				this.shared = k.shared || this.split
			},
			cleanSplit: function(a) {
				A(this.chart.series, function(d) {
					var b = d && d.tt;
					b && (!b.isActive || a ? d.tt = b.destroy() : b.isActive = !1)
				})
			},
			getLabel: function() {
				var a = this.chart.renderer,
					k = this.options;
				this.label || (this.split ? this.label = a.g("tooltip") : (this.label = a.label("", 0, 0, k.shape || "callout", null, null, k.useHTML, null, "tooltip").attr({
						padding: k.padding,
						r: k.borderRadius
					}), this.label.attr({
						fill: k.backgroundColor,
						"stroke-width": k.borderWidth
					}).css(k.style).shadow(k.shadow)),
					this.label.attr({
						zIndex: 8
					}).add());
				return this.label
			},
			update: function(a) {
				this.destroy();
				l(!0, this.chart.options.tooltip.userOptions, a);
				this.init(this.chart, l(!0, this.options, a))
			},
			destroy: function() {
				this.label && (this.label = this.label.destroy());
				this.split && this.tt && (this.cleanSplit(this.chart, !0), this.tt = this.tt.destroy());
				clearTimeout(this.hideTimer);
				clearTimeout(this.tooltipTimeout)
			},
			move: function(a, k, b, e) {
				var d = this,
					g = d.now,
					n = !1 !== d.options.animation && !d.isHidden && (1 < Math.abs(a - g.x) || 1 < Math.abs(k -
						g.y)),
					f = d.followPointer || 1 < d.len;
				F(g, {
					x: n ? (2 * g.x + a) / 3 : a,
					y: n ? (g.y + k) / 2 : k,
					anchorX: f ? void 0 : n ? (2 * g.anchorX + b) / 3 : b,
					anchorY: f ? void 0 : n ? (g.anchorY + e) / 2 : e
				});
				d.getLabel().attr(g);
				n && (clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function() {
					d && d.move(a, k, b, e)
				}, 32))
			},
			hide: function(a) {
				var d = this;
				clearTimeout(this.hideTimer);
				a = r(a, this.options.hideDelay, 500);
				this.isHidden || (this.hideTimer = t(function() {
					d.getLabel()[a ? "fadeOut" : "hide"]();
					d.isHidden = !0
				}, a))
			},
			getAnchor: function(a, k) {
				var b, e = this.chart,
					d = e.inverted,
					g = e.plotTop,
					n = e.plotLeft,
					l = 0,
					m = 0,
					c, r;
				a = u(a);
				b = a[0].tooltipPos;
				this.followPointer && k && (void 0 === k.chartX && (k = e.pointer.normalize(k)), b = [k.chartX - e.plotLeft, k.chartY - g]);
				b || (A(a, function(a) {
					c = a.series.yAxis;
					r = a.series.xAxis;
					l += a.plotX + (!d && r ? r.left - n : 0);
					m += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!d && c ? c.top - g : 0)
				}), l /= a.length, m /= a.length, b = [d ? e.plotWidth - m : l, this.shared && !d && 1 < a.length && k ? k.chartY - g : d ? e.plotHeight - l : m]);
				return f(b, Math.round)
			},
			getPosition: function(a, g, b) {
				var e = this.chart,
					d = this.distance,
					k = {},
					n = b.h || 0,
					f, l = ["y", e.chartHeight, g, b.plotY + e.plotTop, e.plotTop, e.plotTop + e.plotHeight],
					c = ["x", e.chartWidth, a, b.plotX + e.plotLeft, e.plotLeft, e.plotLeft + e.plotWidth],
					m = !this.followPointer && r(b.ttBelow, !e.inverted === !!b.negative),
					q = function(a, b, c, e, p, q) {
						var h = c < e - d,
							g = e + d + c < b,
							f = e - d - c;
						e += d;
						if(m && g) k[a] = e;
						else if(!m && h) k[a] = f;
						else if(h) k[a] = Math.min(q - c, 0 > f - n ? f : f - n);
						else if(g) k[a] = Math.max(p, e + n + c > b ? e : e + n);
						else return !1
					},
					B = function(a, b, c, e) {
						var h;
						e < d || e > b - d ? h = !1 : k[a] = e < c / 2 ? 1 : e > b - c / 2 ?
							b - c - 2 : e - c / 2;
						return h
					},
					t = function(a) {
						var b = l;
						l = c;
						c = b;
						f = a
					},
					p = function() {
						!1 !== q.apply(0, l) ? !1 !== B.apply(0, c) || f || (t(!0), p()) : f ? k.x = k.y = 0 : (t(!0), p())
					};
				(e.inverted || 1 < this.len) && t();
				p();
				return k
			},
			defaultFormatter: function(a) {
				var d = this.points || u(this),
					b;
				b = [a.tooltipFooterHeaderFormatter(d[0])];
				b = b.concat(a.bodyFormatter(d));
				b.push(a.tooltipFooterHeaderFormatter(d[0], !0));
				return b
			},
			refresh: function(a, g) {
				var b, e = this.options,
					d, k = a,
					n, f = {},
					l = [];
				b = e.formatter || this.defaultFormatter;
				var f = this.shared,
					c;
				e.enabled &&
					(clearTimeout(this.hideTimer), this.followPointer = u(k)[0].series.tooltipOptions.followPointer, n = this.getAnchor(k, g), g = n[0], d = n[1], !f || k.series && k.series.noSharedTooltip ? f = k.getLabelConfig() : (A(k, function(a) {
						a.setState("hover");
						l.push(a.getLabelConfig())
					}), f = {
						x: k[0].category,
						y: k[0].y
					}, f.points = l, k = k[0]), this.len = l.length, f = b.call(f, this), c = k.series, this.distance = r(c.tooltipOptions.distance, 16), !1 === f ? this.hide() : (b = this.getLabel(), this.isHidden && b.attr({
						opacity: 1
					}).show(), this.split ? this.renderSplit(f,
						a) : (e.style.width || b.css({
						width: this.chart.spacingBox.width
					}), b.attr({
						text: f && f.join ? f.join("") : f
					}), b.removeClass(/highcharts-color-[\d]+/g).addClass("highcharts-color-" + r(k.colorIndex, c.colorIndex)), b.attr({
						stroke: e.borderColor || k.color || c.color || "#666666"
					}), this.updatePosition({
						plotX: g,
						plotY: d,
						negative: k.negative,
						ttBelow: k.ttBelow,
						h: n[2] || 0
					})), this.isHidden = !1))
			},
			renderSplit: function(d, k) {
				var b = this,
					e = [],
					g = this.chart,
					f = g.renderer,
					n = !0,
					l = this.options,
					m = 0,
					c = this.getLabel();
				A(d.slice(0, k.length + 1),
					function(a, d) {
						if(!1 !== a) {
							d = k[d - 1] || {
								isHeader: !0,
								plotX: k[0].plotX
							};
							var q = d.series || b,
								v = q.tt,
								p = d.series || {},
								z = "highcharts-color-" + r(d.colorIndex, p.colorIndex, "none");
							v || (q.tt = v = f.label(null, null, null, "callout").addClass("highcharts-tooltip-box " + z).attr({
								padding: l.padding,
								r: l.borderRadius,
								fill: l.backgroundColor,
								stroke: l.borderColor || d.color || p.color || "#333333",
								"stroke-width": l.borderWidth
							}).add(c));
							v.isActive = !0;
							v.attr({
								text: a
							});
							v.css(l.style).shadow(l.shadow);
							a = v.getBBox();
							p = a.width + v.strokeWidth();
							d.isHeader ? (m = a.height, p = Math.max(0, Math.min(d.plotX + g.plotLeft - p / 2, g.chartWidth - p))) : p = d.plotX + g.plotLeft - r(l.distance, 16) - p;
							0 > p && (n = !1);
							a = (d.series && d.series.yAxis && d.series.yAxis.pos) + (d.plotY || 0);
							a -= g.plotTop;
							e.push({
								target: d.isHeader ? g.plotHeight + m : a,
								rank: d.isHeader ? 1 : 0,
								size: q.tt.getBBox().height + 1,
								point: d,
								x: p,
								tt: v
							})
						}
					});
				this.cleanSplit();
				a.distribute(e, g.plotHeight + m);
				A(e, function(a) {
					var b = a.point,
						c = b.series;
					a.tt.attr({
						visibility: void 0 === a.pos ? "hidden" : "inherit",
						x: n || b.isHeader ? a.x : b.plotX +
							g.plotLeft + r(l.distance, 16),
						y: a.pos + g.plotTop,
						anchorX: b.isHeader ? b.plotX + g.plotLeft : b.plotX + c.xAxis.pos,
						anchorY: b.isHeader ? a.pos + g.plotTop - 15 : b.plotY + c.yAxis.pos
					})
				})
			},
			updatePosition: function(a) {
				var d = this.chart,
					b = this.getLabel(),
					b = (this.options.positioner || this.getPosition).call(this, b.width, b.height, a);
				this.move(Math.round(b.x), Math.round(b.y || 0), a.plotX + d.plotLeft, a.plotY + d.plotTop)
			},
			getDateFormat: function(a, k, b, e) {
				var d = C("%m-%d %H:%M:%S.%L", k),
					f, n, l = {
						millisecond: 15,
						second: 12,
						minute: 9,
						hour: 6,
						day: 3
					},
					m = "millisecond";
				for(n in g) {
					if(a === g.week && +C("%w", k) === b && "00:00:00.000" === d.substr(6)) {
						n = "week";
						break
					}
					if(g[n] > a) {
						n = m;
						break
					}
					if(l[n] && d.substr(l[n]) !== "01-01 00:00:00.000".substr(l[n])) break;
					"week" !== n && (m = n)
				}
				n && (f = e[n]);
				return f
			},
			getXDateFormat: function(a, g, b) {
				g = g.dateTimeLabelFormats;
				var e = b && b.closestPointRange;
				return(e ? this.getDateFormat(e, a.x, b.options.startOfWeek, g) : g.day) || g.year
			},
			tooltipFooterHeaderFormatter: function(a, g) {
				var b = g ? "footer" : "header";
				g = a.series;
				var e = g.tooltipOptions,
					d = e.xDateFormat,
					k = g.xAxis,
					n = k && "datetime" === k.options.type && m(a.key),
					b = e[b + "Format"];
				n && !d && (d = this.getXDateFormat(a, e, k));
				n && d && (b = b.replace("{point.key}", "{point.key:" + d + "}"));
				return E(b, {
					point: a,
					series: g
				})
			},
			bodyFormatter: function(a) {
				return f(a, function(a) {
					var b = a.series.tooltipOptions;
					return(b.pointFormatter || a.point.tooltipFormatter).call(a.point, b.pointFormat)
				})
			}
		}
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.attr,
			F = a.charts,
			E = a.color,
			m = a.css,
			f = a.defined,
			l = a.each,
			r = a.extend,
			u = a.find,
			t = a.fireEvent,
			g = a.isObject,
			d = a.offset,
			k = a.pick,
			b = a.removeEvent,
			e = a.splat,
			v = a.Tooltip,
			y = a.win;
		a.Pointer = function(a, b) {
			this.init(a, b)
		};
		a.Pointer.prototype = {
			init: function(a, b) {
				this.options = b;
				this.chart = a;
				this.runChartClick = b.chart.events && !!b.chart.events.click;
				this.pinchDown = [];
				this.lastValidTouch = {};
				v && (a.tooltip = new v(a, b.tooltip), this.followTouchMove = k(b.tooltip.followTouchMove, !0));
				this.setDOMEvents()
			},
			zoomOption: function(a) {
				var b = this.chart,
					e = b.options.chart,
					c = e.zoomType || "",
					b = b.inverted;
				/touch/.test(a.type) && (c = k(e.pinchType, c));
				this.zoomX = a = /x/.test(c);
				this.zoomY = c = /y/.test(c);
				this.zoomHor = a && !b || c && b;
				this.zoomVert = c && !b || a && b;
				this.hasZoom = a || c
			},
			normalize: function(a, b) {
				var e, c;
				a = a || y.event;
				a.target || (a.target = a.srcElement);
				c = a.touches ? a.touches.length ? a.touches.item(0) : a.changedTouches[0] : a;
				b || (this.chartPosition = b = d(this.chart.container));
				void 0 === c.pageX ? (e = Math.max(a.x, a.clientX - b.left), b = a.y) : (e = c.pageX - b.left, b = c.pageY - b.top);
				return r(a, {
					chartX: Math.round(e),
					chartY: Math.round(b)
				})
			},
			getCoordinates: function(a) {
				var b = {
					xAxis: [],
					yAxis: []
				};
				l(this.chart.axes, function(e) {
					b[e.isXAxis ? "xAxis" : "yAxis"].push({
						axis: e,
						value: e.toValue(a[e.horiz ? "chartX" : "chartY"])
					})
				});
				return b
			},
			findNearestKDPoint: function(a, b, e) {
				var c;
				l(a, function(a) {
					var d = !(a.noSharedTooltip && b) && 0 > a.options.findNearestPointBy.indexOf("y");
					a = a.searchPoint(e, d);
					if((d = g(a, !0)) && !(d = !g(c, !0))) var d = c.distX - a.distX,
						n = c.dist - a.dist,
						k = (a.series.group && a.series.group.zIndex) - (c.series.group && c.series.group.zIndex),
						d = 0 < (0 !== d && b ? d : 0 !== n ? n : 0 !== k ? k : c.series.index >
							a.series.index ? -1 : 1);
					d && (c = a)
				});
				return c
			},
			getPointFromEvent: function(a) {
				a = a.target;
				for(var b; a && !b;) b = a.point, a = a.parentNode;
				return b
			},
			getChartCoordinatesFromPoint: function(a, b) {
				var e = a.series,
					c = e.xAxis,
					e = e.yAxis;
				if(c && e) return b ? {
					chartX: c.len + c.pos - a.clientX,
					chartY: e.len + e.pos - a.plotY
				} : {
					chartX: a.clientX + c.pos,
					chartY: a.plotY + e.pos
				}
			},
			getHoverData: function(b, e, d, c, f, q) {
				var n, v = [];
				c = !(!c || !b);
				var p = e && !e.stickyTracking ? [e] : a.grep(d, function(a) {
					return a.visible && !(!f && a.directTouch) && k(a.options.enableMouseTracking, !0) && a.stickyTracking
				});
				e = (n = c ? b : this.findNearestKDPoint(p, f, q)) && n.series;
				n && (f && !e.noSharedTooltip ? (p = a.grep(d, function(a) {
					return a.visible && !(!f && a.directTouch) && k(a.options.enableMouseTracking, !0) && !a.noSharedTooltip
				}), l(p, function(a) {
					a = u(a.points, function(a) {
						return a.x === n.x
					});
					g(a) && !a.isNull && v.push(a)
				})) : v.push(n));
				return {
					hoverPoint: n,
					hoverSeries: e,
					hoverPoints: v
				}
			},
			runPointActions: function(b, e) {
				var d = this.chart,
					c = d.tooltip,
					g = c ? c.shared : !1,
					n = e || d.hoverPoint,
					f = n && n.series || d.hoverSeries,
					f = this.getHoverData(n,
						f, d.series, !!e || f && f.directTouch && this.isDirectTouch, g, b),
					v, n = f.hoverPoint;
				v = f.hoverPoints;
				e = (f = f.hoverSeries) && f.tooltipOptions.followPointer;
				g = g && f && !f.noSharedTooltip;
				if(n && (n !== d.hoverPoint || c && c.isHidden)) {
					l(d.hoverPoints || [], function(b) {
						-1 === a.inArray(b, v) && b.setState()
					});
					l(v || [], function(a) {
						a.setState("hover")
					});
					if(d.hoverSeries !== f) f.onMouseOver();
					d.hoverPoint && d.hoverPoint.firePointEvent("mouseOut");
					n.firePointEvent("mouseOver");
					d.hoverPoints = v;
					d.hoverPoint = n;
					c && c.refresh(g ? v : n, b)
				} else e &&
					c && !c.isHidden && (n = c.getAnchor([{}], b), c.updatePosition({
						plotX: n[0],
						plotY: n[1]
					}));
				this.unDocMouseMove || (this.unDocMouseMove = C(d.container.ownerDocument, "mousemove", function(b) {
					var c = F[a.hoverChartIndex];
					if(c) c.pointer.onDocumentMouseMove(b)
				}));
				l(d.axes, function(c) {
					var e = k(c.crosshair.snap, !0),
						p = e ? a.find(v, function(a) {
							return a.series[c.coll] === c
						}) : void 0;
					p || !e ? c.drawCrosshair(b, p) : c.hideCrosshair()
				})
			},
			reset: function(a, b) {
				var d = this.chart,
					c = d.hoverSeries,
					g = d.hoverPoint,
					n = d.hoverPoints,
					f = d.tooltip,
					k =
					f && f.shared ? n : g;
				a && k && l(e(k), function(b) {
					b.series.isCartesian && void 0 === b.plotX && (a = !1)
				});
				if(a) f && k && (f.refresh(k), g && (g.setState(g.state, !0), l(d.axes, function(a) {
					a.crosshair && a.drawCrosshair(null, g)
				})));
				else {
					if(g) g.onMouseOut();
					n && l(n, function(a) {
						a.setState()
					});
					if(c) c.onMouseOut();
					f && f.hide(b);
					this.unDocMouseMove && (this.unDocMouseMove = this.unDocMouseMove());
					l(d.axes, function(a) {
						a.hideCrosshair()
					});
					this.hoverX = d.hoverPoints = d.hoverPoint = null
				}
			},
			scaleGroups: function(a, b) {
				var e = this.chart,
					c;
				l(e.series,
					function(d) {
						c = a || d.getPlotBox();
						d.xAxis && d.xAxis.zoomEnabled && d.group && (d.group.attr(c), d.markerGroup && (d.markerGroup.attr(c), d.markerGroup.clip(b ? e.clipRect : null)), d.dataLabelsGroup && d.dataLabelsGroup.attr(c))
					});
				e.clipRect.attr(b || e.clipBox)
			},
			dragStart: function(a) {
				var b = this.chart;
				b.mouseIsDown = a.type;
				b.cancelClick = !1;
				b.mouseDownX = this.mouseDownX = a.chartX;
				b.mouseDownY = this.mouseDownY = a.chartY
			},
			drag: function(a) {
				var b = this.chart,
					e = b.options.chart,
					c = a.chartX,
					d = a.chartY,
					g = this.zoomHor,
					n = this.zoomVert,
					f = b.plotLeft,
					p = b.plotTop,
					k = b.plotWidth,
					v = b.plotHeight,
					l, h = this.selectionMarker,
					w = this.mouseDownX,
					m = this.mouseDownY,
					r = e.panKey && a[e.panKey + "Key"];
				h && h.touch || (c < f ? c = f : c > f + k && (c = f + k), d < p ? d = p : d > p + v && (d = p + v), this.hasDragged = Math.sqrt(Math.pow(w - c, 2) + Math.pow(m - d, 2)), 10 < this.hasDragged && (l = b.isInsidePlot(w - f, m - p), b.hasCartesianSeries && (this.zoomX || this.zoomY) && l && !r && !h && (this.selectionMarker = h = b.renderer.rect(f, p, g ? 1 : k, n ? 1 : v, 0).attr({
					fill: e.selectionMarkerFill || E("#335cad").setOpacity(.25).get(),
					"class": "highcharts-selection-marker",
					zIndex: 7
				}).add()), h && g && (c -= w, h.attr({
					width: Math.abs(c),
					x: (0 < c ? 0 : c) + w
				})), h && n && (c = d - m, h.attr({
					height: Math.abs(c),
					y: (0 < c ? 0 : c) + m
				})), l && !h && e.panning && b.pan(a, e.panning)))
			},
			drop: function(a) {
				var b = this,
					e = this.chart,
					c = this.hasPinched;
				if(this.selectionMarker) {
					var d = {
							originalEvent: a,
							xAxis: [],
							yAxis: []
						},
						g = this.selectionMarker,
						n = g.attr ? g.attr("x") : g.x,
						k = g.attr ? g.attr("y") : g.y,
						p = g.attr ? g.attr("width") : g.width,
						v = g.attr ? g.attr("height") : g.height,
						I;
					if(this.hasDragged || c) l(e.axes, function(e) {
						if(e.zoomEnabled && f(e.min) &&
							(c || b[{
								xAxis: "zoomX",
								yAxis: "zoomY"
							}[e.coll]])) {
							var h = e.horiz,
								g = "touchend" === a.type ? e.minPixelPadding : 0,
								q = e.toValue((h ? n : k) + g),
								h = e.toValue((h ? n + p : k + v) - g);
							d[e.coll].push({
								axis: e,
								min: Math.min(q, h),
								max: Math.max(q, h)
							});
							I = !0
						}
					}), I && t(e, "selection", d, function(a) {
						e.zoom(r(a, c ? {
							animation: !1
						} : null))
					});
					this.selectionMarker = this.selectionMarker.destroy();
					c && this.scaleGroups()
				}
				e && (m(e.container, {
					cursor: e._cursor
				}), e.cancelClick = 10 < this.hasDragged, e.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = [])
			},
			onContainerMouseDown: function(a) {
				a = this.normalize(a);
				this.zoomOption(a);
				a.preventDefault && a.preventDefault();
				this.dragStart(a)
			},
			onDocumentMouseUp: function(b) {
				F[a.hoverChartIndex] && F[a.hoverChartIndex].pointer.drop(b)
			},
			onDocumentMouseMove: function(a) {
				var b = this.chart,
					e = this.chartPosition;
				a = this.normalize(a, e);
				!e || this.inClass(a.target, "highcharts-tracker") || b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) || this.reset()
			},
			onContainerMouseLeave: function(b) {
				var e = F[a.hoverChartIndex];
				e && (b.relatedTarget ||
					b.toElement) && (e.pointer.reset(), e.pointer.chartPosition = null)
			},
			onContainerMouseMove: function(b) {
				var e = this.chart;
				f(a.hoverChartIndex) && F[a.hoverChartIndex] && F[a.hoverChartIndex].mouseIsDown || (a.hoverChartIndex = e.index);
				b = this.normalize(b);
				b.returnValue = !1;
				"mousedown" === e.mouseIsDown && this.drag(b);
				!this.inClass(b.target, "highcharts-tracker") && !e.isInsidePlot(b.chartX - e.plotLeft, b.chartY - e.plotTop) || e.openMenu || this.runPointActions(b)
			},
			inClass: function(a, b) {
				for(var e; a;) {
					if(e = A(a, "class")) {
						if(-1 !==
							e.indexOf(b)) return !0;
						if(-1 !== e.indexOf("highcharts-container")) return !1
					}
					a = a.parentNode
				}
			},
			onTrackerMouseOut: function(a) {
				var b = this.chart.hoverSeries;
				a = a.relatedTarget || a.toElement;
				this.isDirectTouch = !1;
				if(!(!b || !a || b.stickyTracking || this.inClass(a, "highcharts-tooltip") || this.inClass(a, "highcharts-series-" + b.index) && this.inClass(a, "highcharts-tracker"))) b.onMouseOut()
			},
			onContainerClick: function(a) {
				var b = this.chart,
					e = b.hoverPoint,
					c = b.plotLeft,
					d = b.plotTop;
				a = this.normalize(a);
				b.cancelClick || (e && this.inClass(a.target,
					"highcharts-tracker") ? (t(e.series, "click", r(a, {
					point: e
				})), b.hoverPoint && e.firePointEvent("click", a)) : (r(a, this.getCoordinates(a)), b.isInsidePlot(a.chartX - c, a.chartY - d) && t(b, "click", a)))
			},
			setDOMEvents: function() {
				var b = this,
					e = b.chart.container,
					d = e.ownerDocument;
				e.onmousedown = function(a) {
					b.onContainerMouseDown(a)
				};
				e.onmousemove = function(a) {
					b.onContainerMouseMove(a)
				};
				e.onclick = function(a) {
					b.onContainerClick(a)
				};
				C(e, "mouseleave", b.onContainerMouseLeave);
				1 === a.chartCount && C(d, "mouseup", b.onDocumentMouseUp);
				a.hasTouch && (e.ontouchstart = function(a) {
					b.onContainerTouchStart(a)
				}, e.ontouchmove = function(a) {
					b.onContainerTouchMove(a)
				}, 1 === a.chartCount && C(d, "touchend", b.onDocumentTouchEnd))
			},
			destroy: function() {
				var e = this,
					d = this.chart.container.ownerDocument;
				e.unDocMouseMove && e.unDocMouseMove();
				b(e.chart.container, "mouseleave", e.onContainerMouseLeave);
				a.chartCount || (b(d, "mouseup", e.onDocumentMouseUp), a.hasTouch && b(d, "touchend", e.onDocumentTouchEnd));
				clearInterval(e.tooltipTimeout);
				a.objectEach(e, function(a, b) {
					e[b] =
						null
				})
			}
		}
	})(M);
	(function(a) {
		var C = a.charts,
			A = a.each,
			F = a.extend,
			E = a.map,
			m = a.noop,
			f = a.pick;
		F(a.Pointer.prototype, {
			pinchTranslate: function(a, f, m, t, g, d) {
				this.zoomHor && this.pinchTranslateDirection(!0, a, f, m, t, g, d);
				this.zoomVert && this.pinchTranslateDirection(!1, a, f, m, t, g, d)
			},
			pinchTranslateDirection: function(a, f, m, t, g, d, k, b) {
				var e = this.chart,
					v = a ? "x" : "y",
					l = a ? "X" : "Y",
					n = "chart" + l,
					r = a ? "width" : "height",
					u = e["plot" + (a ? "Left" : "Top")],
					c, G, q = b || 1,
					B = e.inverted,
					K = e.bounds[a ? "h" : "v"],
					p = 1 === f.length,
					z = f[0][n],
					I = m[0][n],
					L = !p && f[1][n],
					h = !p && m[1][n],
					w;
				m = function() {
					!p && 20 < Math.abs(z - L) && (q = b || Math.abs(I - h) / Math.abs(z - L));
					G = (u - I) / q + z;
					c = e["plot" + (a ? "Width" : "Height")] / q
				};
				m();
				f = G;
				f < K.min ? (f = K.min, w = !0) : f + c > K.max && (f = K.max - c, w = !0);
				w ? (I -= .8 * (I - k[v][0]), p || (h -= .8 * (h - k[v][1])), m()) : k[v] = [I, h];
				B || (d[v] = G - u, d[r] = c);
				d = B ? 1 / q : q;
				g[r] = c;
				g[v] = f;
				t[B ? a ? "scaleY" : "scaleX" : "scale" + l] = q;
				t["translate" + l] = d * u + (I - d * z)
			},
			pinch: function(a) {
				var l = this,
					u = l.chart,
					t = l.pinchDown,
					g = a.touches,
					d = g.length,
					k = l.lastValidTouch,
					b = l.hasZoom,
					e = l.selectionMarker,
					v = {},
					y = 1 === d && (l.inClass(a.target, "highcharts-tracker") && u.runTrackerClick || l.runChartClick),
					n = {};
				1 < d && (l.initiated = !0);
				b && l.initiated && !y && a.preventDefault();
				E(g, function(a) {
					return l.normalize(a)
				});
				"touchstart" === a.type ? (A(g, function(a, b) {
					t[b] = {
						chartX: a.chartX,
						chartY: a.chartY
					}
				}), k.x = [t[0].chartX, t[1] && t[1].chartX], k.y = [t[0].chartY, t[1] && t[1].chartY], A(u.axes, function(a) {
					if(a.zoomEnabled) {
						var b = u.bounds[a.horiz ? "h" : "v"],
							e = a.minPixelPadding,
							d = a.toPixels(f(a.options.min, a.dataMin)),
							g = a.toPixels(f(a.options.max,
								a.dataMax)),
							k = Math.max(d, g);
						b.min = Math.min(a.pos, Math.min(d, g) - e);
						b.max = Math.max(a.pos + a.len, k + e)
					}
				}), l.res = !0) : l.followTouchMove && 1 === d ? this.runPointActions(l.normalize(a)) : t.length && (e || (l.selectionMarker = e = F({
					destroy: m,
					touch: !0
				}, u.plotBox)), l.pinchTranslate(t, g, v, e, n, k), l.hasPinched = b, l.scaleGroups(v, n), l.res && (l.res = !1, this.reset(!1, 0)))
			},
			touch: function(l, m) {
				var r = this.chart,
					t, g;
				if(r.index !== a.hoverChartIndex) this.onContainerMouseLeave({
					relatedTarget: !0
				});
				a.hoverChartIndex = r.index;
				1 === l.touches.length ?
					(l = this.normalize(l), (g = r.isInsidePlot(l.chartX - r.plotLeft, l.chartY - r.plotTop)) && !r.openMenu ? (m && this.runPointActions(l), "touchmove" === l.type && (m = this.pinchDown, t = m[0] ? 4 <= Math.sqrt(Math.pow(m[0].chartX - l.chartX, 2) + Math.pow(m[0].chartY - l.chartY, 2)) : !1), f(t, !0) && this.pinch(l)) : m && this.reset()) : 2 === l.touches.length && this.pinch(l)
			},
			onContainerTouchStart: function(a) {
				this.zoomOption(a);
				this.touch(a, !0)
			},
			onContainerTouchMove: function(a) {
				this.touch(a)
			},
			onDocumentTouchEnd: function(f) {
				C[a.hoverChartIndex] &&
					C[a.hoverChartIndex].pointer.drop(f)
			}
		})
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.charts,
			F = a.css,
			E = a.doc,
			m = a.extend,
			f = a.noop,
			l = a.Pointer,
			r = a.removeEvent,
			u = a.win,
			t = a.wrap;
		if(!a.hasTouch && (u.PointerEvent || u.MSPointerEvent)) {
			var g = {},
				d = !!u.PointerEvent,
				k = function() {
					var b = [];
					b.item = function(a) {
						return this[a]
					};
					a.objectEach(g, function(a) {
						b.push({
							pageX: a.pageX,
							pageY: a.pageY,
							target: a.target
						})
					});
					return b
				},
				b = function(b, d, g, n) {
					"touch" !== b.pointerType && b.pointerType !== b.MSPOINTER_TYPE_TOUCH || !A[a.hoverChartIndex] ||
						(n(b), n = A[a.hoverChartIndex].pointer, n[d]({
							type: g,
							target: b.currentTarget,
							preventDefault: f,
							touches: k()
						}))
				};
			m(l.prototype, {
				onContainerPointerDown: function(a) {
					b(a, "onContainerTouchStart", "touchstart", function(a) {
						g[a.pointerId] = {
							pageX: a.pageX,
							pageY: a.pageY,
							target: a.currentTarget
						}
					})
				},
				onContainerPointerMove: function(a) {
					b(a, "onContainerTouchMove", "touchmove", function(a) {
						g[a.pointerId] = {
							pageX: a.pageX,
							pageY: a.pageY
						};
						g[a.pointerId].target || (g[a.pointerId].target = a.currentTarget)
					})
				},
				onDocumentPointerUp: function(a) {
					b(a,
						"onDocumentTouchEnd", "touchend",
						function(a) {
							delete g[a.pointerId]
						})
				},
				batchMSEvents: function(a) {
					a(this.chart.container, d ? "pointerdown" : "MSPointerDown", this.onContainerPointerDown);
					a(this.chart.container, d ? "pointermove" : "MSPointerMove", this.onContainerPointerMove);
					a(E, d ? "pointerup" : "MSPointerUp", this.onDocumentPointerUp)
				}
			});
			t(l.prototype, "init", function(a, b, d) {
				a.call(this, b, d);
				this.hasZoom && F(b.container, {
					"-ms-touch-action": "none",
					"touch-action": "none"
				})
			});
			t(l.prototype, "setDOMEvents", function(a) {
				a.apply(this);
				(this.hasZoom || this.followTouchMove) && this.batchMSEvents(C)
			});
			t(l.prototype, "destroy", function(a) {
				this.batchMSEvents(r);
				a.call(this)
			})
		}
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.css,
			F = a.discardElement,
			E = a.defined,
			m = a.each,
			f = a.isFirefox,
			l = a.marginNames,
			r = a.merge,
			u = a.pick,
			t = a.setAnimation,
			g = a.stableSort,
			d = a.win,
			k = a.wrap;
		a.Legend = function(a, e) {
			this.init(a, e)
		};
		a.Legend.prototype = {
			init: function(a, e) {
				this.chart = a;
				this.setOptions(e);
				e.enabled && (this.render(), C(this.chart, "endResize", function() {
					this.legend.positionCheckboxes()
				}))
			},
			setOptions: function(a) {
				var b = u(a.padding, 8);
				this.options = a;
				this.itemStyle = a.itemStyle;
				this.itemHiddenStyle = r(this.itemStyle, a.itemHiddenStyle);
				this.itemMarginTop = a.itemMarginTop || 0;
				this.padding = b;
				this.initialItemY = b - 5;
				this.itemHeight = this.maxItemWidth = 0;
				this.symbolWidth = u(a.symbolWidth, 16);
				this.pages = []
			},
			update: function(a, e) {
				var b = this.chart;
				this.setOptions(r(!0, this.options, a));
				this.destroy();
				b.isDirtyLegend = b.isDirtyBox = !0;
				u(e, !0) && b.redraw()
			},
			colorizeItem: function(a, e) {
				a.legendGroup[e ? "removeClass" :
					"addClass"]("highcharts-legend-item-hidden");
				var b = this.options,
					d = a.legendItem,
					g = a.legendLine,
					f = a.legendSymbol,
					k = this.itemHiddenStyle.color,
					b = e ? b.itemStyle.color : k,
					c = e ? a.color || k : k,
					l = a.options && a.options.marker,
					q = {
						fill: c
					};
				d && d.css({
					fill: b,
					color: b
				});
				g && g.attr({
					stroke: c
				});
				f && (l && f.isMarker && (q = a.pointAttribs(), e || (q.stroke = q.fill = k)), f.attr(q))
			},
			positionItem: function(a) {
				var b = this.options,
					d = b.symbolPadding,
					b = !b.rtl,
					g = a._legendItemPos,
					f = g[0],
					g = g[1],
					k = a.checkbox;
				(a = a.legendGroup) && a.element && a.translate(b ?
					f : this.legendWidth - f - 2 * d - 4, g);
				k && (k.x = f, k.y = g)
			},
			destroyItem: function(a) {
				var b = a.checkbox;
				m(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function(b) {
					a[b] && (a[b] = a[b].destroy())
				});
				b && F(a.checkbox)
			},
			destroy: function() {
				function a(a) {
					this[a] && (this[a] = this[a].destroy())
				}
				m(this.getAllItems(), function(b) {
					m(["legendItem", "legendGroup"], a, b)
				});
				m("clipRect up down pager nav box title group".split(" "), a, this);
				this.display = null
			},
			positionCheckboxes: function(a) {
				var b = this.group && this.group.alignAttr,
					d, g = this.clipHeight || this.legendHeight,
					f = this.titleHeight;
				b && (d = b.translateY, m(this.allItems, function(e) {
					var k = e.checkbox,
						c;
					k && (c = d + f + k.y + (a || 0) + 3, A(k, {
						left: b.translateX + e.checkboxOffset + k.x - 20 + "px",
						top: c + "px",
						display: c > d - 6 && c < d + g - 6 ? "" : "none"
					}))
				}))
			},
			renderTitle: function() {
				var a = this.options,
					e = this.padding,
					d = a.title,
					g = 0;
				d.text && (this.title || (this.title = this.chart.renderer.label(d.text, e - 3, e - 4, null, null, null, a.useHTML, null, "legend-title").attr({
						zIndex: 1
					}).css(d.style).add(this.group)), a = this.title.getBBox(),
					g = a.height, this.offsetWidth = a.width, this.contentGroup.attr({
						translateY: g
					}));
				this.titleHeight = g
			},
			setText: function(b) {
				var e = this.options;
				b.legendItem.attr({
					text: e.labelFormat ? a.format(e.labelFormat, b) : e.labelFormatter.call(b)
				})
			},
			renderItem: function(a) {
				var b = this.chart,
					d = b.renderer,
					g = this.options,
					f = "horizontal" === g.layout,
					k = this.symbolWidth,
					l = g.symbolPadding,
					c = this.itemStyle,
					m = this.itemHiddenStyle,
					q = this.padding,
					B = f ? u(g.itemDistance, 20) : 0,
					t = !g.rtl,
					p = g.width,
					z = g.itemMarginBottom || 0,
					I = this.itemMarginTop,
					L = a.legendItem,
					h = !a.series,
					w = !h && a.series.drawLegendSymbol ? a.series : a,
					P = w.options,
					H = this.createCheckboxForItem && P && P.showCheckbox,
					P = k + l + B + (H ? 20 : 0),
					O = g.useHTML,
					A = a.options.className;
				L || (a.legendGroup = d.g("legend-item").addClass("highcharts-" + w.type + "-series highcharts-color-" + a.colorIndex + (A ? " " + A : "") + (h ? " highcharts-series-" + a.index : "")).attr({
						zIndex: 1
					}).add(this.scrollGroup), a.legendItem = L = d.text("", t ? k + l : -l, this.baseline || 0, O).css(r(a.visible ? c : m)).attr({
						align: t ? "left" : "right",
						zIndex: 2
					}).add(a.legendGroup),
					this.baseline || (k = c.fontSize, this.fontMetrics = d.fontMetrics(k, L), this.baseline = this.fontMetrics.f + 3 + I, L.attr("y", this.baseline)), this.symbolHeight = g.symbolHeight || this.fontMetrics.f, w.drawLegendSymbol(this, a), this.setItemEvents && this.setItemEvents(a, L, O), H && this.createCheckboxForItem(a));
				this.colorizeItem(a, a.visible);
				c.width || L.css({
					width: (g.itemWidth || g.width || b.spacingBox.width) - P
				});
				this.setText(a);
				d = L.getBBox();
				c = a.checkboxOffset = g.itemWidth || a.legendItemWidth || d.width + P;
				this.itemHeight = d = Math.round(a.legendItemHeight ||
					d.height || this.symbolHeight);
				f && this.itemX - q + c > (p || b.spacingBox.width - 2 * q - g.x) && (this.itemX = q, this.itemY += I + this.lastLineHeight + z, this.lastLineHeight = 0);
				this.maxItemWidth = Math.max(this.maxItemWidth, c);
				this.lastItemY = I + this.itemY + z;
				this.lastLineHeight = Math.max(d, this.lastLineHeight);
				a._legendItemPos = [this.itemX, this.itemY];
				f ? this.itemX += c : (this.itemY += I + d + z, this.lastLineHeight = d);
				this.offsetWidth = p || Math.max((f ? this.itemX - q - (a.checkbox ? 0 : B) : c) + q, this.offsetWidth)
			},
			getAllItems: function() {
				var a = [];
				m(this.chart.series,
					function(b) {
						var e = b && b.options;
						b && u(e.showInLegend, E(e.linkedTo) ? !1 : void 0, !0) && (a = a.concat(b.legendItems || ("point" === e.legendType ? b.data : b)))
					});
				return a
			},
			adjustMargins: function(a, e) {
				var b = this.chart,
					d = this.options,
					g = d.align.charAt(0) + d.verticalAlign.charAt(0) + d.layout.charAt(0);
				d.floating || m([/(lth|ct|rth)/, /(rtv|rm|rbv)/, /(rbh|cb|lbh)/, /(lbv|lm|ltv)/], function(f, k) {
					f.test(g) && !E(a[k]) && (b[l[k]] = Math.max(b[l[k]], b.legend[(k + 1) % 2 ? "legendHeight" : "legendWidth"] + [1, -1, -1, 1][k] * d[k % 2 ? "x" : "y"] + u(d.margin,
						12) + e[k]))
				})
			},
			render: function() {
				var a = this,
					e = a.chart,
					d = e.renderer,
					f = a.group,
					k, l, t, c, u = a.box,
					q = a.options,
					B = a.padding;
				a.itemX = B;
				a.itemY = a.initialItemY;
				a.offsetWidth = 0;
				a.lastItemY = 0;
				f || (a.group = f = d.g("legend").attr({
					zIndex: 7
				}).add(), a.contentGroup = d.g().attr({
					zIndex: 1
				}).add(f), a.scrollGroup = d.g().add(a.contentGroup));
				a.renderTitle();
				k = a.getAllItems();
				g(k, function(a, b) {
					return(a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0)
				});
				q.reversed && k.reverse();
				a.allItems = k;
				a.display = l = !!k.length;
				a.lastLineHeight = 0;
				m(k, function(b) {
					a.renderItem(b)
				});
				t = (q.width || a.offsetWidth) + B;
				c = a.lastItemY + a.lastLineHeight + a.titleHeight;
				c = a.handleOverflow(c);
				c += B;
				u || (a.box = u = d.rect().addClass("highcharts-legend-box").attr({
					r: q.borderRadius
				}).add(f), u.isNew = !0);
				u.attr({
					stroke: q.borderColor,
					"stroke-width": q.borderWidth || 0,
					fill: q.backgroundColor || "none"
				}).shadow(q.shadow);
				0 < t && 0 < c && (u[u.isNew ? "attr" : "animate"](u.crisp({
					x: 0,
					y: 0,
					width: t,
					height: c
				}, u.strokeWidth())), u.isNew = !1);
				u[l ? "show" : "hide"]();
				a.legendWidth =
					t;
				a.legendHeight = c;
				m(k, function(b) {
					a.positionItem(b)
				});
				l && f.align(r(q, {
					width: t,
					height: c
				}), !0, "spacingBox");
				e.isResizing || this.positionCheckboxes()
			},
			handleOverflow: function(a) {
				var b = this,
					d = this.chart,
					g = d.renderer,
					f = this.options,
					k = f.y,
					l = this.padding,
					d = d.spacingBox.height + ("top" === f.verticalAlign ? -k : k) - l,
					k = f.maxHeight,
					c, r = this.clipRect,
					q = f.navigation,
					B = u(q.animation, !0),
					t = q.arrowSize || 12,
					p = this.nav,
					z = this.pages,
					I, L = this.allItems,
					h = function(a) {
						"number" === typeof a ? r.attr({
							height: a
						}) : r && (b.clipRect = r.destroy(),
							b.contentGroup.clip());
						b.contentGroup.div && (b.contentGroup.div.style.clip = a ? "rect(" + l + "px,9999px," + (l + a) + "px,0)" : "auto")
					};
				"horizontal" !== f.layout || "middle" === f.verticalAlign || f.floating || (d /= 2);
				k && (d = Math.min(d, k));
				z.length = 0;
				a > d && !1 !== q.enabled ? (this.clipHeight = c = Math.max(d - 20 - this.titleHeight - l, 0), this.currentPage = u(this.currentPage, 1), this.fullHeight = a, m(L, function(a, b) {
					var e = a._legendItemPos[1];
					a = Math.round(a.legendItem.getBBox().height);
					var d = z.length;
					if(!d || e - z[d - 1] > c && (I || e) !== z[d - 1]) z.push(I ||
						e), d++;
					b === L.length - 1 && e + a - z[d - 1] > c && z.push(e);
					e !== I && (I = e)
				}), r || (r = b.clipRect = g.clipRect(0, l, 9999, 0), b.contentGroup.clip(r)), h(c), p || (this.nav = p = g.g().attr({
					zIndex: 1
				}).add(this.group), this.up = g.symbol("triangle", 0, 0, t, t).on("click", function() {
					b.scroll(-1, B)
				}).add(p), this.pager = g.text("", 15, 10).addClass("highcharts-legend-navigation").css(q.style).add(p), this.down = g.symbol("triangle-down", 0, 0, t, t).on("click", function() {
					b.scroll(1, B)
				}).add(p)), b.scroll(0), a = d) : p && (h(), this.nav = p.destroy(), this.scrollGroup.attr({
						translateY: 1
					}),
					this.clipHeight = 0);
				return a
			},
			scroll: function(a, e) {
				var b = this.pages,
					d = b.length;
				a = this.currentPage + a;
				var g = this.clipHeight,
					f = this.options.navigation,
					k = this.pager,
					c = this.padding;
				a > d && (a = d);
				0 < a && (void 0 !== e && t(e, this.chart), this.nav.attr({
					translateX: c,
					translateY: g + this.padding + 7 + this.titleHeight,
					visibility: "visible"
				}), this.up.attr({
					"class": 1 === a ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
				}), k.attr({
					text: a + "/" + d
				}), this.down.attr({
					x: 18 + this.pager.getBBox().width,
					"class": a === d ? "highcharts-legend-nav-inactive" : "highcharts-legend-nav-active"
				}), this.up.attr({
					fill: 1 === a ? f.inactiveColor : f.activeColor
				}).css({
					cursor: 1 === a ? "default" : "pointer"
				}), this.down.attr({
					fill: a === d ? f.inactiveColor : f.activeColor
				}).css({
					cursor: a === d ? "default" : "pointer"
				}), e = -b[a - 1] + this.initialItemY, this.scrollGroup.animate({
					translateY: e
				}), this.currentPage = a, this.positionCheckboxes(e))
			}
		};
		a.LegendSymbolMixin = {
			drawRectangle: function(a, e) {
				var b = a.symbolHeight,
					d = a.options.squareSymbol;
				e.legendSymbol = this.chart.renderer.rect(d ? (a.symbolWidth - b) /
					2 : 0, a.baseline - b + 1, d ? b : a.symbolWidth, b, u(a.options.symbolRadius, b / 2)).addClass("highcharts-point").attr({
					zIndex: 3
				}).add(e.legendGroup)
			},
			drawLineMarker: function(a) {
				var b = this.options,
					d = b.marker,
					g = a.symbolWidth,
					f = a.symbolHeight,
					k = f / 2,
					l = this.chart.renderer,
					c = this.legendGroup;
				a = a.baseline - Math.round(.3 * a.fontMetrics.b);
				var m;
				m = {
					"stroke-width": b.lineWidth || 0
				};
				b.dashStyle && (m.dashstyle = b.dashStyle);
				this.legendLine = l.path(["M", 0, a, "L", g, a]).addClass("highcharts-graph").attr(m).add(c);
				d && !1 !== d.enabled &&
					(b = Math.min(u(d.radius, k), k), 0 === this.symbol.indexOf("url") && (d = r(d, {
						width: f,
						height: f
					}), b = 0), this.legendSymbol = d = l.symbol(this.symbol, g / 2 - b, a - b, 2 * b, 2 * b, d).addClass("highcharts-point").add(c), d.isMarker = !0)
			}
		};
		(/Trident\/7\.0/.test(d.navigator.userAgent) || f) && k(a.Legend.prototype, "positionItem", function(a, e) {
			var b = this,
				d = function() {
					e._legendItemPos && a.call(b, e)
				};
			d();
			setTimeout(d)
		})
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.animate,
			F = a.animObject,
			E = a.attr,
			m = a.doc,
			f = a.Axis,
			l = a.createElement,
			r = a.defaultOptions,
			u = a.discardElement,
			t = a.charts,
			g = a.css,
			d = a.defined,
			k = a.each,
			b = a.extend,
			e = a.find,
			v = a.fireEvent,
			y = a.getStyle,
			n = a.grep,
			D = a.isNumber,
			J = a.isObject,
			c = a.isString,
			G = a.Legend,
			q = a.marginNames,
			B = a.merge,
			K = a.objectEach,
			p = a.Pointer,
			z = a.pick,
			I = a.pInt,
			L = a.removeEvent,
			h = a.seriesTypes,
			w = a.splat,
			P = a.svg,
			H = a.syncTimeout,
			O = a.win,
			Q = a.Renderer,
			R = a.Chart = function() {
				this.getArgs.apply(this, arguments)
			};
		a.chart = function(a, b, c) {
			return new R(a, b, c)
		};
		b(R.prototype, {
			callbacks: [],
			getArgs: function() {
				var a = [].slice.call(arguments);
				if(c(a[0]) || a[0].nodeName) this.renderTo = a.shift();
				this.init(a[0], a[1])
			},
			init: function(b, c) {
				var e, d, h = b.series,
					p = b.plotOptions || {};
				b.series = null;
				e = B(r, b);
				for(d in e.plotOptions) e.plotOptions[d].tooltip = p[d] && B(p[d].tooltip) || void 0;
				e.tooltip.userOptions = b.chart && b.chart.forExport && b.tooltip.userOptions || b.tooltip;
				e.series = b.series = h;
				this.userOptions = b;
				b = e.chart;
				d = b.events;
				this.margin = [];
				this.spacing = [];
				this.bounds = {
					h: {},
					v: {}
				};
				this.callback = c;
				this.isResizing = 0;
				this.options = e;
				this.axes = [];
				this.series = [];
				this.hasCartesianSeries = b.showAxes;
				var g = this;
				g.index = t.length;
				t.push(g);
				a.chartCount++;
				d && K(d, function(a, b) {
					C(g, b, a)
				});
				g.xAxis = [];
				g.yAxis = [];
				g.pointCount = g.colorCounter = g.symbolCounter = 0;
				g.firstRender()
			},
			initSeries: function(b) {
				var c = this.options.chart;
				(c = h[b.type || c.type || c.defaultSeriesType]) || a.error(17, !0);
				c = new c;
				c.init(this, b);
				return c
			},
			orderSeries: function(a) {
				var b = this.series;
				for(a = a || 0; a < b.length; a++) b[a] && (b[a].index = a, b[a].name = b[a].name || "Series " + (b[a].index + 1))
			},
			isInsidePlot: function(a,
				b, c) {
				var e = c ? b : a;
				a = c ? a : b;
				return 0 <= e && e <= this.plotWidth && 0 <= a && a <= this.plotHeight
			},
			redraw: function(c) {
				var e = this.axes,
					d = this.series,
					h = this.pointer,
					p = this.legend,
					g = this.isDirtyLegend,
					f, q, l = this.hasCartesianSeries,
					n = this.isDirtyBox,
					z, m = this.renderer,
					x = m.isHidden(),
					w = [];
				this.setResponsive && this.setResponsive(!1);
				a.setAnimation(c, this);
				x && this.temporaryDisplay();
				this.layOutTitles();
				for(c = d.length; c--;)
					if(z = d[c], z.options.stacking && (f = !0, z.isDirty)) {
						q = !0;
						break
					}
				if(q)
					for(c = d.length; c--;) z = d[c], z.options.stacking &&
						(z.isDirty = !0);
				k(d, function(a) {
					a.isDirty && "point" === a.options.legendType && (a.updateTotals && a.updateTotals(), g = !0);
					a.isDirtyData && v(a, "updatedData")
				});
				g && p.options.enabled && (p.render(), this.isDirtyLegend = !1);
				f && this.getStacks();
				l && k(e, function(a) {
					a.updateNames();
					a.setScale()
				});
				this.getMargins();
				l && (k(e, function(a) {
					a.isDirty && (n = !0)
				}), k(e, function(a) {
					var c = a.min + "," + a.max;
					a.extKey !== c && (a.extKey = c, w.push(function() {
						v(a, "afterSetExtremes", b(a.eventArgs, a.getExtremes()));
						delete a.eventArgs
					}));
					(n || f) &&
					a.redraw()
				}));
				n && this.drawChartBox();
				v(this, "predraw");
				k(d, function(a) {
					(n || a.isDirty) && a.visible && a.redraw();
					a.isDirtyData = !1
				});
				h && h.reset(!0);
				m.draw();
				v(this, "redraw");
				v(this, "render");
				x && this.temporaryDisplay(!0);
				k(w, function(a) {
					a.call()
				})
			},
			get: function(a) {
				function b(b) {
					return b.id === a || b.options && b.options.id === a
				}
				var c, d = this.series,
					h;
				c = e(this.axes, b) || e(this.series, b);
				for(h = 0; !c && h < d.length; h++) c = e(d[h].points || [], b);
				return c
			},
			getAxes: function() {
				var a = this,
					b = this.options,
					c = b.xAxis = w(b.xAxis || {}),
					b = b.yAxis = w(b.yAxis || {});
				k(c, function(a, b) {
					a.index = b;
					a.isX = !0
				});
				k(b, function(a, b) {
					a.index = b
				});
				c = c.concat(b);
				k(c, function(b) {
					new f(a, b)
				})
			},
			getSelectedPoints: function() {
				var a = [];
				k(this.series, function(b) {
					a = a.concat(n(b.data || [], function(a) {
						return a.selected
					}))
				});
				return a
			},
			getSelectedSeries: function() {
				return n(this.series, function(a) {
					return a.selected
				})
			},
			setTitle: function(a, b, c) {
				var e = this,
					d = e.options,
					h;
				h = d.title = B({
					style: {
						color: "#333333",
						fontSize: d.isStock ? "16px" : "18px"
					}
				}, d.title, a);
				d = d.subtitle =
					B({
						style: {
							color: "#666666"
						}
					}, d.subtitle, b);
				k([
					["title", a, h],
					["subtitle", b, d]
				], function(a, b) {
					var c = a[0],
						d = e[c],
						h = a[1];
					a = a[2];
					d && h && (e[c] = d = d.destroy());
					a && a.text && !d && (e[c] = e.renderer.text(a.text, 0, 0, a.useHTML).attr({
						align: a.align,
						"class": "highcharts-" + c,
						zIndex: a.zIndex || 4
					}).add(), e[c].update = function(a) {
						e.setTitle(!b && a, b && a)
					}, e[c].css(a.style))
				});
				e.layOutTitles(c)
			},
			layOutTitles: function(a) {
				var c = 0,
					e, d = this.renderer,
					h = this.spacingBox;
				k(["title", "subtitle"], function(a) {
					var e = this[a],
						p = this.options[a];
					a = "title" === a ? -3 : p.verticalAlign ? 0 : c + 2;
					var g;
					e && (g = p.style.fontSize, g = d.fontMetrics(g, e).b, e.css({
						width: (p.width || h.width + p.widthAdjust) + "px"
					}).align(b({
						y: a + g
					}, p), !1, "spacingBox"), p.floating || p.verticalAlign || (c = Math.ceil(c + e.getBBox(p.useHTML).height)))
				}, this);
				e = this.titleOffset !== c;
				this.titleOffset = c;
				!this.isDirtyBox && e && (this.isDirtyBox = e, this.hasRendered && z(a, !0) && this.isDirtyBox && this.redraw())
			},
			getChartSize: function() {
				var b = this.options.chart,
					c = b.width,
					b = b.height,
					e = this.renderTo;
				d(c) || (this.containerWidth =
					y(e, "width"));
				d(b) || (this.containerHeight = y(e, "height"));
				this.chartWidth = Math.max(0, c || this.containerWidth || 600);
				this.chartHeight = Math.max(0, a.relativeLength(b, this.chartWidth) || this.containerHeight || 400)
			},
			temporaryDisplay: function(b) {
				var c = this.renderTo;
				if(b)
					for(; c && c.style;) c.hcOrigStyle && (a.css(c, c.hcOrigStyle), delete c.hcOrigStyle), c.hcOrigDetached && (m.body.removeChild(c), c.hcOrigDetached = !1), c = c.parentNode;
				else
					for(; c && c.style;) {
						m.body.contains(c) || (c.hcOrigDetached = !0, m.body.appendChild(c));
						if("none" === y(c, "display", !1) || c.hcOricDetached) c.hcOrigStyle = {
							display: c.style.display,
							height: c.style.height,
							overflow: c.style.overflow
						}, b = {
							display: "block",
							overflow: "hidden"
						}, c !== this.renderTo && (b.height = 0), a.css(c, b), c.offsetWidth || c.style.setProperty("display", "block", "important");
						c = c.parentNode;
						if(c === m.body) break
					}
			},
			setClassName: function(a) {
				this.container.className = "highcharts-container " + (a || "")
			},
			getContainer: function() {
				var e, d = this.options,
					h = d.chart,
					p, g;
				e = this.renderTo;
				var f = a.uniqueKey(),
					k;
				e ||
					(this.renderTo = e = h.renderTo);
				c(e) && (this.renderTo = e = m.getElementById(e));
				e || a.error(13, !0);
				p = I(E(e, "data-highcharts-chart"));
				D(p) && t[p] && t[p].hasRendered && t[p].destroy();
				E(e, "data-highcharts-chart", this.index);
				e.innerHTML = "";
				h.skipClone || e.offsetWidth || this.temporaryDisplay();
				this.getChartSize();
				p = this.chartWidth;
				g = this.chartHeight;
				k = b({
					position: "relative",
					overflow: "hidden",
					width: p + "px",
					height: g + "px",
					textAlign: "left",
					lineHeight: "normal",
					zIndex: 0,
					"-webkit-tap-highlight-color": "rgba(0,0,0,0)"
				}, h.style);
				this.container = e = l("div", {
					id: f
				}, k, e);
				this._cursor = e.style.cursor;
				this.renderer = new(a[h.renderer] || Q)(e, p, g, null, h.forExport, d.exporting && d.exporting.allowHTML);
				this.setClassName(h.className);
				this.renderer.setStyle(h.style);
				this.renderer.chartIndex = this.index
			},
			getMargins: function(a) {
				var b = this.spacing,
					c = this.margin,
					e = this.titleOffset;
				this.resetMargins();
				e && !d(c[0]) && (this.plotTop = Math.max(this.plotTop, e + this.options.title.margin + b[0]));
				this.legend.display && this.legend.adjustMargins(c, b);
				this.extraMargin &&
					(this[this.extraMargin.type] = (this[this.extraMargin.type] || 0) + this.extraMargin.value);
				this.extraTopMargin && (this.plotTop += this.extraTopMargin);
				a || this.getAxisMargins()
			},
			getAxisMargins: function() {
				var a = this,
					b = a.axisOffset = [0, 0, 0, 0],
					c = a.margin;
				a.hasCartesianSeries && k(a.axes, function(a) {
					a.visible && a.getOffset()
				});
				k(q, function(e, h) {
					d(c[h]) || (a[e] += b[h])
				});
				a.setChartSize()
			},
			reflow: function(a) {
				var b = this,
					c = b.options.chart,
					e = b.renderTo,
					h = d(c.width) && d(c.height),
					p = c.width || y(e, "width"),
					c = c.height || y(e, "height"),
					e = a ? a.target : O;
				if(!h && !b.isPrinting && p && c && (e === O || e === m)) {
					if(p !== b.containerWidth || c !== b.containerHeight) clearTimeout(b.reflowTimeout), b.reflowTimeout = H(function() {
						b.container && b.setSize(void 0, void 0, !1)
					}, a ? 100 : 0);
					b.containerWidth = p;
					b.containerHeight = c
				}
			},
			initReflow: function() {
				var a = this,
					b;
				b = C(O, "resize", function(b) {
					a.reflow(b)
				});
				C(a, "destroy", b)
			},
			setSize: function(b, c, e) {
				var d = this,
					h = d.renderer;
				d.isResizing += 1;
				a.setAnimation(e, d);
				d.oldChartHeight = d.chartHeight;
				d.oldChartWidth = d.chartWidth;
				void 0 !==
					b && (d.options.chart.width = b);
				void 0 !== c && (d.options.chart.height = c);
				d.getChartSize();
				b = h.globalAnimation;
				(b ? A : g)(d.container, {
					width: d.chartWidth + "px",
					height: d.chartHeight + "px"
				}, b);
				d.setChartSize(!0);
				h.setSize(d.chartWidth, d.chartHeight, e);
				k(d.axes, function(a) {
					a.isDirty = !0;
					a.setScale()
				});
				d.isDirtyLegend = !0;
				d.isDirtyBox = !0;
				d.layOutTitles();
				d.getMargins();
				d.redraw(e);
				d.oldChartHeight = null;
				v(d, "resize");
				H(function() {
					d && v(d, "endResize", null, function() {
						--d.isResizing
					})
				}, F(b).duration)
			},
			setChartSize: function(a) {
				function b(a) {
					a =
						f[a] || 0;
					return Math.max(m || a, a) / 2
				}
				var c = this.inverted,
					e = this.renderer,
					d = this.chartWidth,
					h = this.chartHeight,
					p = this.options.chart,
					g = this.spacing,
					f = this.clipOffset,
					q, n, l, z, m;
				this.plotLeft = q = Math.round(this.plotLeft);
				this.plotTop = n = Math.round(this.plotTop);
				this.plotWidth = l = Math.max(0, Math.round(d - q - this.marginRight));
				this.plotHeight = z = Math.max(0, Math.round(h - n - this.marginBottom));
				this.plotSizeX = c ? z : l;
				this.plotSizeY = c ? l : z;
				this.plotBorderWidth = p.plotBorderWidth || 0;
				this.spacingBox = e.spacingBox = {
					x: g[3],
					y: g[0],
					width: d - g[3] - g[1],
					height: h - g[0] - g[2]
				};
				this.plotBox = e.plotBox = {
					x: q,
					y: n,
					width: l,
					height: z
				};
				m = 2 * Math.floor(this.plotBorderWidth / 2);
				c = Math.ceil(b(3));
				e = Math.ceil(b(0));
				this.clipBox = {
					x: c,
					y: e,
					width: Math.floor(this.plotSizeX - b(1) - c),
					height: Math.max(0, Math.floor(this.plotSizeY - b(2) - e))
				};
				a || k(this.axes, function(a) {
					a.setAxisSize();
					a.setAxisTranslation()
				})
			},
			resetMargins: function() {
				var a = this,
					b = a.options.chart;
				k(["margin", "spacing"], function(c) {
					var e = b[c],
						d = J(e) ? e : [e, e, e, e];
					k(["Top", "Right", "Bottom", "Left"], function(e,
						h) {
						a[c][h] = z(b[c + e], d[h])
					})
				});
				k(q, function(b, c) {
					a[b] = z(a.margin[c], a.spacing[c])
				});
				a.axisOffset = [0, 0, 0, 0];
				a.clipOffset = []
			},
			drawChartBox: function() {
				var a = this.options.chart,
					b = this.renderer,
					c = this.chartWidth,
					e = this.chartHeight,
					d = this.chartBackground,
					h = this.plotBackground,
					p = this.plotBorder,
					g, f = this.plotBGImage,
					k = a.backgroundColor,
					q = a.plotBackgroundColor,
					l = a.plotBackgroundImage,
					n, z = this.plotLeft,
					m = this.plotTop,
					w = this.plotWidth,
					I = this.plotHeight,
					v = this.plotBox,
					r = this.clipRect,
					B = this.clipBox,
					y = "animate";
				d || (this.chartBackground = d = b.rect().addClass("highcharts-background").add(), y = "attr");
				g = a.borderWidth || 0;
				n = g + (a.shadow ? 8 : 0);
				k = {
					fill: k || "none"
				};
				if(g || d["stroke-width"]) k.stroke = a.borderColor, k["stroke-width"] = g;
				d.attr(k).shadow(a.shadow);
				d[y]({
					x: n / 2,
					y: n / 2,
					width: c - n - g % 2,
					height: e - n - g % 2,
					r: a.borderRadius
				});
				y = "animate";
				h || (y = "attr", this.plotBackground = h = b.rect().addClass("highcharts-plot-background").add());
				h[y](v);
				h.attr({
					fill: q || "none"
				}).shadow(a.plotShadow);
				l && (f ? f.animate(v) : this.plotBGImage = b.image(l,
					z, m, w, I).add());
				r ? r.animate({
					width: B.width,
					height: B.height
				}) : this.clipRect = b.clipRect(B);
				y = "animate";
				p || (y = "attr", this.plotBorder = p = b.rect().addClass("highcharts-plot-border").attr({
					zIndex: 1
				}).add());
				p.attr({
					stroke: a.plotBorderColor,
					"stroke-width": a.plotBorderWidth || 0,
					fill: "none"
				});
				p[y](p.crisp({
					x: z,
					y: m,
					width: w,
					height: I
				}, -p.strokeWidth()));
				this.isDirtyBox = !1
			},
			propFromSeries: function() {
				var a = this,
					b = a.options.chart,
					c, e = a.options.series,
					d, p;
				k(["inverted", "angular", "polar"], function(g) {
					c = h[b.type || b.defaultSeriesType];
					p = b[g] || c && c.prototype[g];
					for(d = e && e.length; !p && d--;)(c = h[e[d].type]) && c.prototype[g] && (p = !0);
					a[g] = p
				})
			},
			linkSeries: function() {
				var a = this,
					b = a.series;
				k(b, function(a) {
					a.linkedSeries.length = 0
				});
				k(b, function(b) {
					var e = b.options.linkedTo;
					c(e) && (e = ":previous" === e ? a.series[b.index - 1] : a.get(e)) && e.linkedParent !== b && (e.linkedSeries.push(b), b.linkedParent = e, b.visible = z(b.options.visible, e.options.visible, b.visible))
				})
			},
			renderSeries: function() {
				k(this.series, function(a) {
					a.translate();
					a.render()
				})
			},
			renderLabels: function() {
				var a =
					this,
					c = a.options.labels;
				c.items && k(c.items, function(e) {
					var d = b(c.style, e.style),
						h = I(d.left) + a.plotLeft,
						p = I(d.top) + a.plotTop + 12;
					delete d.left;
					delete d.top;
					a.renderer.text(e.html, h, p).attr({
						zIndex: 2
					}).css(d).add()
				})
			},
			render: function() {
				var a = this.axes,
					b = this.renderer,
					c = this.options,
					e, d, h;
				this.setTitle();
				this.legend = new G(this, c.legend);
				this.getStacks && this.getStacks();
				this.getMargins(!0);
				this.setChartSize();
				c = this.plotWidth;
				e = this.plotHeight -= 21;
				k(a, function(a) {
					a.setScale()
				});
				this.getAxisMargins();
				d =
					1.1 < c / this.plotWidth;
				h = 1.05 < e / this.plotHeight;
				if(d || h) k(a, function(a) {
					(a.horiz && d || !a.horiz && h) && a.setTickInterval(!0)
				}), this.getMargins();
				this.drawChartBox();
				this.hasCartesianSeries && k(a, function(a) {
					a.visible && a.render()
				});
				this.seriesGroup || (this.seriesGroup = b.g("series-group").attr({
					zIndex: 3
				}).add());
				this.renderSeries();
				this.renderLabels();
				this.addCredits();
				this.setResponsive && this.setResponsive();
				this.hasRendered = !0
			},
			addCredits: function(a) {
				var b = this;
				a = B(!0, this.options.credits, a);
				a.enabled && !this.credits &&
					(this.credits = this.renderer.text(a.text + (this.mapCredits || ""), 0, 0).addClass("highcharts-credits").on("click", function() {
						a.href && (O.location.href = a.href)
					}).attr({
						align: a.position.align,
						zIndex: 8
					}).css(a.style).add().align(a.position), this.credits.update = function(a) {
						b.credits = b.credits.destroy();
						b.addCredits(a)
					})
			},
			destroy: function() {
				var b = this,
					c = b.axes,
					e = b.series,
					d = b.container,
					h, p = d && d.parentNode;
				v(b, "destroy");
				b.renderer.forExport ? a.erase(t, b) : t[b.index] = void 0;
				a.chartCount--;
				b.renderTo.removeAttribute("data-highcharts-chart");
				L(b);
				for(h = c.length; h--;) c[h] = c[h].destroy();
				this.scroller && this.scroller.destroy && this.scroller.destroy();
				for(h = e.length; h--;) e[h] = e[h].destroy();
				k("title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer".split(" "), function(a) {
					var c = b[a];
					c && c.destroy && (b[a] = c.destroy())
				});
				d && (d.innerHTML = "", L(d), p && u(d));
				K(b, function(a, c) {
					delete b[c]
				})
			},
			isReadyToRender: function() {
				var a = this;
				return P || O != O.top ||
					"complete" === m.readyState ? !0 : (m.attachEvent("onreadystatechange", function() {
						m.detachEvent("onreadystatechange", a.firstRender);
						"complete" === m.readyState && a.firstRender()
					}), !1)
			},
			firstRender: function() {
				var a = this,
					b = a.options;
				if(a.isReadyToRender()) {
					a.getContainer();
					v(a, "init");
					a.resetMargins();
					a.setChartSize();
					a.propFromSeries();
					a.getAxes();
					k(b.series || [], function(b) {
						a.initSeries(b)
					});
					a.linkSeries();
					v(a, "beforeRender");
					p && (a.pointer = new p(a, b));
					a.render();
					if(!a.renderer.imgCount && a.onload) a.onload();
					a.temporaryDisplay(!0)
				}
			},
			onload: function() {
				k([this.callback].concat(this.callbacks), function(a) {
					a && void 0 !== this.index && a.apply(this, [this])
				}, this);
				v(this, "load");
				v(this, "render");
				d(this.index) && !1 !== this.options.chart.reflow && this.initReflow();
				this.onload = null
			}
		})
	})(M);
	(function(a) {
		var C, A = a.each,
			F = a.extend,
			E = a.erase,
			m = a.fireEvent,
			f = a.format,
			l = a.isArray,
			r = a.isNumber,
			u = a.pick,
			t = a.removeEvent;
		a.Point = C = function() {};
		a.Point.prototype = {
			init: function(a, d, f) {
				this.series = a;
				this.color = a.color;
				this.applyOptions(d,
					f);
				a.options.colorByPoint ? (d = a.options.colors || a.chart.options.colors, this.color = this.color || d[a.colorCounter], d = d.length, f = a.colorCounter, a.colorCounter++, a.colorCounter === d && (a.colorCounter = 0)) : f = a.colorIndex;
				this.colorIndex = u(this.colorIndex, f);
				a.chart.pointCount++;
				return this
			},
			applyOptions: function(a, d) {
				var g = this.series,
					b = g.options.pointValKey || g.pointValKey;
				a = C.prototype.optionsToObject.call(this, a);
				F(this, a);
				this.options = this.options ? F(this.options, a) : a;
				a.group && delete this.group;
				b && (this.y =
					this[b]);
				this.isNull = u(this.isValid && !this.isValid(), null === this.x || !r(this.y, !0));
				this.selected && (this.state = "select");
				"name" in this && void 0 === d && g.xAxis && g.xAxis.hasNames && (this.x = g.xAxis.nameToX(this));
				void 0 === this.x && g && (this.x = void 0 === d ? g.autoIncrement(this) : d);
				return this
			},
			optionsToObject: function(a) {
				var d = {},
					g = this.series,
					b = g.options.keys,
					e = b || g.pointArrayMap || ["y"],
					f = e.length,
					m = 0,
					n = 0;
				if(r(a) || null === a) d[e[0]] = a;
				else if(l(a))
					for(!b && a.length > f && (g = typeof a[0], "string" === g ? d.name = a[0] : "number" ===
							g && (d.x = a[0]), m++); n < f;) b && void 0 === a[m] || (d[e[n]] = a[m]), m++, n++;
				else "object" === typeof a && (d = a, a.dataLabels && (g._hasPointLabels = !0), a.marker && (g._hasPointMarkers = !0));
				return d
			},
			getClassName: function() {
				return "highcharts-point" + (this.selected ? " highcharts-point-select" : "") + (this.negative ? " highcharts-negative" : "") + (this.isNull ? " highcharts-null-point" : "") + (void 0 !== this.colorIndex ? " highcharts-color-" + this.colorIndex : "") + (this.options.className ? " " + this.options.className : "") + (this.zone && this.zone.className ?
					" " + this.zone.className.replace("highcharts-negative", "") : "")
			},
			getZone: function() {
				var a = this.series,
					d = a.zones,
					a = a.zoneAxis || "y",
					f = 0,
					b;
				for(b = d[f]; this[a] >= b.value;) b = d[++f];
				b && b.color && !this.options.color && (this.color = b.color);
				return b
			},
			destroy: function() {
				var a = this.series.chart,
					d = a.hoverPoints,
					f;
				a.pointCount--;
				d && (this.setState(), E(d, this), d.length || (a.hoverPoints = null));
				if(this === a.hoverPoint) this.onMouseOut();
				if(this.graphic || this.dataLabel) t(this), this.destroyElements();
				this.legendItem && a.legend.destroyItem(this);
				for(f in this) this[f] = null
			},
			destroyElements: function() {
				for(var a = ["graphic", "dataLabel", "dataLabelUpper", "connector", "shadowGroup"], d, f = 6; f--;) d = a[f], this[d] && (this[d] = this[d].destroy())
			},
			getLabelConfig: function() {
				return {
					x: this.category,
					y: this.y,
					color: this.color,
					colorIndex: this.colorIndex,
					key: this.name || this.category,
					series: this.series,
					point: this,
					percentage: this.percentage,
					total: this.total || this.stackTotal
				}
			},
			tooltipFormatter: function(a) {
				var d = this.series,
					g = d.tooltipOptions,
					b = u(g.valueDecimals, ""),
					e = g.valuePrefix || "",
					l = g.valueSuffix || "";
				A(d.pointArrayMap || ["y"], function(d) {
					d = "{point." + d;
					if(e || l) a = a.replace(d + "}", e + d + "}" + l);
					a = a.replace(d + "}", d + ":,." + b + "f}")
				});
				return f(a, {
					point: this,
					series: this.series
				})
			},
			firePointEvent: function(a, d, f) {
				var b = this,
					e = this.series.options;
				(e.point.events[a] || b.options && b.options.events && b.options.events[a]) && this.importEvents();
				"click" === a && e.allowPointSelect && (f = function(a) {
					b.select && b.select(null, a.ctrlKey || a.metaKey || a.shiftKey)
				});
				m(this, a, d, f)
			},
			visible: !0
		}
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.animObject,
			F = a.arrayMax,
			E = a.arrayMin,
			m = a.correctFloat,
			f = a.Date,
			l = a.defaultOptions,
			r = a.defaultPlotOptions,
			u = a.defined,
			t = a.each,
			g = a.erase,
			d = a.extend,
			k = a.fireEvent,
			b = a.grep,
			e = a.isArray,
			v = a.isNumber,
			y = a.isString,
			n = a.merge,
			D = a.objectEach,
			J = a.pick,
			c = a.removeEvent,
			G = a.splat,
			q = a.SVGElement,
			B = a.syncTimeout,
			K = a.win;
		a.Series = a.seriesType("line", null, {
			lineWidth: 2,
			allowPointSelect: !1,
			showCheckbox: !1,
			animation: {
				duration: 1E3
			},
			events: {},
			marker: {
				lineWidth: 0,
				lineColor: "#ffffff",
				radius: 4,
				states: {
					hover: {
						animation: {
							duration: 50
						},
						enabled: !0,
						radiusPlus: 2,
						lineWidthPlus: 1
					},
					select: {
						fillColor: "#cccccc",
						lineColor: "#000000",
						lineWidth: 2
					}
				}
			},
			point: {
				events: {}
			},
			dataLabels: {
				align: "center",
				formatter: function() {
					return null === this.y ? "" : a.numberFormat(this.y, -1)
				},
				style: {
					fontSize: "11px",
					fontWeight: "bold",
					color: "contrast",
					textOutline: "1px contrast"
				},
				verticalAlign: "bottom",
				x: 0,
				y: 0,
				padding: 5
			},
			cropThreshold: 300,
			pointRange: 0,
			softThreshold: !0,
			states: {
				hover: {
					animation: {
						duration: 50
					},
					lineWidthPlus: 1,
					marker: {},
					halo: {
						size: 10,
						opacity: .25
					}
				},
				select: {
					marker: {}
				}
			},
			stickyTracking: !0,
			turboThreshold: 1E3,
			findNearestPointBy: "x"
		}, {
			isCartesian: !0,
			pointClass: a.Point,
			sorted: !0,
			requireSorting: !0,
			directTouch: !1,
			axisTypes: ["xAxis", "yAxis"],
			colorCounter: 0,
			parallelArrays: ["x", "y"],
			coll: "series",
			init: function(a, b) {
				var c = this,
					e, h = a.series,
					p;
				c.chart = a;
				c.options = b = c.setOptions(b);
				c.linkedSeries = [];
				c.bindAxes();
				d(c, {
					name: b.name,
					state: "",
					visible: !1 !== b.visible,
					selected: !0 === b.selected
				});
				e = b.events;
				D(e, function(a, b) {
					C(c, b, a)
				});
				if(e &&
					e.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = !0;
				c.getColor();
				c.getSymbol();
				t(c.parallelArrays, function(a) {
					c[a + "Data"] = []
				});
				c.setData(b.data, !1);
				c.isCartesian && (a.hasCartesianSeries = !0);
				h.length && (p = h[h.length - 1]);
				c._i = J(p && p._i, -1) + 1;
				a.orderSeries(this.insert(h))
			},
			insert: function(a) {
				var b = this.options.index,
					c;
				if(v(b)) {
					for(c = a.length; c--;)
						if(b >= J(a[c].options.index, a[c]._i)) {
							a.splice(c + 1, 0, this);
							break
						} - 1 === c && a.unshift(this);
					c += 1
				} else a.push(this);
				return J(c,
					a.length - 1)
			},
			bindAxes: function() {
				var b = this,
					c = b.options,
					e = b.chart,
					d;
				t(b.axisTypes || [], function(h) {
					t(e[h], function(a) {
						d = a.options;
						if(c[h] === d.index || void 0 !== c[h] && c[h] === d.id || void 0 === c[h] && 0 === d.index) b.insert(a.series), b[h] = a, a.isDirty = !0
					});
					b[h] || b.optionalAxis === h || a.error(18, !0)
				})
			},
			updateParallelArrays: function(a, b) {
				var c = a.series,
					e = arguments,
					d = v(b) ? function(e) {
						var d = "y" === e && c.toYData ? c.toYData(a) : a[e];
						c[e + "Data"][b] = d
					} : function(a) {
						Array.prototype[b].apply(c[a + "Data"], Array.prototype.slice.call(e,
							2))
					};
				t(c.parallelArrays, d)
			},
			autoIncrement: function() {
				var a = this.options,
					b = this.xIncrement,
					c, e = a.pointIntervalUnit,
					b = J(b, a.pointStart, 0);
				this.pointInterval = c = J(this.pointInterval, a.pointInterval, 1);
				e && (a = new f(b), "day" === e ? a = +a[f.hcSetDate](a[f.hcGetDate]() + c) : "month" === e ? a = +a[f.hcSetMonth](a[f.hcGetMonth]() + c) : "year" === e && (a = +a[f.hcSetFullYear](a[f.hcGetFullYear]() + c)), c = a - b);
				this.xIncrement = b + c;
				return b
			},
			setOptions: function(a) {
				var b = this.chart,
					c = b.options,
					e = c.plotOptions,
					d = (b.userOptions || {}).plotOptions || {},
					p = e[this.type];
				this.userOptions = a;
				b = n(p, e.series, a);
				this.tooltipOptions = n(l.tooltip, l.plotOptions.series && l.plotOptions.series.tooltip, l.plotOptions[this.type].tooltip, c.tooltip.userOptions, e.series && e.series.tooltip, e[this.type].tooltip, a.tooltip);
				this.stickyTracking = J(a.stickyTracking, d[this.type] && d[this.type].stickyTracking, d.series && d.series.stickyTracking, this.tooltipOptions.shared && !this.noSharedTooltip ? !0 : b.stickyTracking);
				null === p.marker && delete b.marker;
				this.zoneAxis = b.zoneAxis;
				a = this.zones =
					(b.zones || []).slice();
				!b.negativeColor && !b.negativeFillColor || b.zones || a.push({
					value: b[this.zoneAxis + "Threshold"] || b.threshold || 0,
					className: "highcharts-negative",
					color: b.negativeColor,
					fillColor: b.negativeFillColor
				});
				a.length && u(a[a.length - 1].value) && a.push({
					color: this.color,
					fillColor: this.fillColor
				});
				return b
			},
			getCyclic: function(a, b, c) {
				var e, d = this.chart,
					p = this.userOptions,
					f = a + "Index",
					g = a + "Counter",
					k = c ? c.length : J(d.options.chart[a + "Count"], d[a + "Count"]);
				b || (e = J(p[f], p["_" + f]), u(e) || (d.series.length ||
					(d[g] = 0), p["_" + f] = e = d[g] % k, d[g] += 1), c && (b = c[e]));
				void 0 !== e && (this[f] = e);
				this[a] = b
			},
			getColor: function() {
				this.options.colorByPoint ? this.options.color = null : this.getCyclic("color", this.options.color || r[this.type].color, this.chart.options.colors)
			},
			getSymbol: function() {
				this.getCyclic("symbol", this.options.marker.symbol, this.chart.options.symbols)
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawLineMarker,
			setData: function(b, c, d, f) {
				var h = this,
					p = h.points,
					g = p && p.length || 0,
					k, q = h.options,
					l = h.chart,
					n = null,
					m = h.xAxis,
					z = q.turboThreshold,
					r = this.xData,
					B = this.yData,
					I = (k = h.pointArrayMap) && k.length;
				b = b || [];
				k = b.length;
				c = J(c, !0);
				if(!1 !== f && k && g === k && !h.cropped && !h.hasGroupedData && h.visible) t(b, function(a, b) {
					p[b].update && a !== q.data[b] && p[b].update(a, !1, null, !1)
				});
				else {
					h.xIncrement = null;
					h.colorCounter = 0;
					t(this.parallelArrays, function(a) {
						h[a + "Data"].length = 0
					});
					if(z && k > z) {
						for(d = 0; null === n && d < k;) n = b[d], d++;
						if(v(n))
							for(d = 0; d < k; d++) r[d] = this.autoIncrement(), B[d] = b[d];
						else if(e(n))
							if(I)
								for(d = 0; d < k; d++) n = b[d], r[d] = n[0], B[d] = n.slice(1,
									I + 1);
							else
								for(d = 0; d < k; d++) n = b[d], r[d] = n[0], B[d] = n[1];
						else a.error(12)
					} else
						for(d = 0; d < k; d++) void 0 !== b[d] && (n = {
							series: h
						}, h.pointClass.prototype.applyOptions.apply(n, [b[d]]), h.updateParallelArrays(n, d));
					y(B[0]) && a.error(14, !0);
					h.data = [];
					h.options.data = h.userOptions.data = b;
					for(d = g; d--;) p[d] && p[d].destroy && p[d].destroy();
					m && (m.minRange = m.userMinRange);
					h.isDirty = l.isDirtyBox = !0;
					h.isDirtyData = !!p;
					d = !1
				}
				"point" === q.legendType && (this.processData(), this.generatePoints());
				c && l.redraw(d)
			},
			processData: function(b) {
				var c =
					this.xData,
					e = this.yData,
					d = c.length,
					h;
				h = 0;
				var p, f, g = this.xAxis,
					k, q = this.options;
				k = q.cropThreshold;
				var n = this.getExtremesFromAll || q.getExtremesFromAll,
					l = this.isCartesian,
					q = g && g.val2lin,
					m = g && g.isLog,
					v, r;
				if(l && !this.isDirty && !g.isDirty && !this.yAxis.isDirty && !b) return !1;
				g && (b = g.getExtremes(), v = b.min, r = b.max);
				if(l && this.sorted && !n && (!k || d > k || this.forceCrop))
					if(c[d - 1] < v || c[0] > r) c = [], e = [];
					else if(c[0] < v || c[d - 1] > r) h = this.cropData(this.xData, this.yData, v, r), c = h.xData, e = h.yData, h = h.start, p = !0;
				for(k = c.length ||
					1; --k;) d = m ? q(c[k]) - q(c[k - 1]) : c[k] - c[k - 1], 0 < d && (void 0 === f || d < f) ? f = d : 0 > d && this.requireSorting && a.error(15);
				this.cropped = p;
				this.cropStart = h;
				this.processedXData = c;
				this.processedYData = e;
				this.closestPointRange = f
			},
			cropData: function(a, b, c, e) {
				var d = a.length,
					p = 0,
					g = d,
					f = J(this.cropShoulder, 1),
					k;
				for(k = 0; k < d; k++)
					if(a[k] >= c) {
						p = Math.max(0, k - f);
						break
					}
				for(c = k; c < d; c++)
					if(a[c] > e) {
						g = c + f;
						break
					}
				return {
					xData: a.slice(p, g),
					yData: b.slice(p, g),
					start: p,
					end: g
				}
			},
			generatePoints: function() {
				var a = this.options,
					b = a.data,
					c = this.data,
					e, d = this.processedXData,
					g = this.processedYData,
					f = this.pointClass,
					k = d.length,
					q = this.cropStart || 0,
					n, l = this.hasGroupedData,
					a = a.keys,
					m, v = [],
					r;
				c || l || (c = [], c.length = b.length, c = this.data = c);
				a && l && (this.options.keys = !1);
				for(r = 0; r < k; r++) n = q + r, l ? (m = (new f).init(this, [d[r]].concat(G(g[r]))), m.dataGroup = this.groupMap[r]) : (m = c[n]) || void 0 === b[n] || (c[n] = m = (new f).init(this, b[n], d[r])), m && (m.index = n, v[r] = m);
				this.options.keys = a;
				if(c && (k !== (e = c.length) || l))
					for(r = 0; r < e; r++) r !== q || l || (r += k), c[r] && (c[r].destroyElements(),
						c[r].plotX = void 0);
				this.data = c;
				this.points = v
			},
			getExtremes: function(a) {
				var b = this.yAxis,
					c = this.processedXData,
					d, h = [],
					p = 0;
				d = this.xAxis.getExtremes();
				var g = d.min,
					f = d.max,
					k, q, n, l;
				a = a || this.stackedYData || this.processedYData || [];
				d = a.length;
				for(l = 0; l < d; l++)
					if(q = c[l], n = a[l], k = (v(n, !0) || e(n)) && (!b.positiveValuesOnly || n.length || 0 < n), q = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped || (c[l] || q) >= g && (c[l] || q) <= f, k && q)
						if(k = n.length)
							for(; k--;) null !== n[k] && (h[p++] = n[k]);
						else h[p++] = n;
				this.dataMin =
					E(h);
				this.dataMax = F(h)
			},
			translate: function() {
				this.processedXData || this.processData();
				this.generatePoints();
				var a = this.options,
					b = a.stacking,
					c = this.xAxis,
					e = c.categories,
					d = this.yAxis,
					g = this.points,
					f = g.length,
					k = !!this.modifyValue,
					q = a.pointPlacement,
					n = "between" === q || v(q),
					l = a.threshold,
					r = a.startFromThreshold ? l : 0,
					B, y, t, G, D = Number.MAX_VALUE;
				"between" === q && (q = .5);
				v(q) && (q *= J(a.pointRange || c.pointRange));
				for(a = 0; a < f; a++) {
					var K = g[a],
						A = K.x,
						C = K.y;
					y = K.low;
					var E = b && d.stacks[(this.negStacks && C < (r ? 0 : l) ? "-" : "") + this.stackKey],
						F;
					d.positiveValuesOnly && null !== C && 0 >= C && (K.isNull = !0);
					K.plotX = B = m(Math.min(Math.max(-1E5, c.translate(A, 0, 0, 0, 1, q, "flags" === this.type)), 1E5));
					b && this.visible && !K.isNull && E && E[A] && (G = this.getStackIndicator(G, A, this.index), F = E[A], C = F.points[G.key], y = C[0], C = C[1], y === r && G.key === E[A].base && (y = J(l, d.min)), d.positiveValuesOnly && 0 >= y && (y = null), K.total = K.stackTotal = F.total, K.percentage = F.total && K.y / F.total * 100, K.stackY = C, F.setOffset(this.pointXOffset || 0, this.barW || 0));
					K.yBottom = u(y) ? d.translate(y, 0, 1, 0, 1) :
						null;
					k && (C = this.modifyValue(C, K));
					K.plotY = y = "number" === typeof C && Infinity !== C ? Math.min(Math.max(-1E5, d.translate(C, 0, 1, 0, 1)), 1E5) : void 0;
					K.isInside = void 0 !== y && 0 <= y && y <= d.len && 0 <= B && B <= c.len;
					K.clientX = n ? m(c.translate(A, 0, 0, 0, 1, q)) : B;
					K.negative = K.y < (l || 0);
					K.category = e && void 0 !== e[K.x] ? e[K.x] : K.x;
					K.isNull || (void 0 !== t && (D = Math.min(D, Math.abs(B - t))), t = B);
					K.zone = this.zones.length && K.getZone()
				}
				this.closestPointRangePx = D
			},
			getValidPoints: function(a, c) {
				var e = this.chart;
				return b(a || this.points || [], function(a) {
					return c &&
						!e.isInsidePlot(a.plotX, a.plotY, e.inverted) ? !1 : !a.isNull
				})
			},
			setClip: function(a) {
				var b = this.chart,
					c = this.options,
					e = b.renderer,
					d = b.inverted,
					p = this.clipBox,
					g = p || b.clipBox,
					f = this.sharedClipKey || ["_sharedClip", a && a.duration, a && a.easing, g.height, c.xAxis, c.yAxis].join(),
					k = b[f],
					q = b[f + "m"];
				k || (a && (g.width = 0, b[f + "m"] = q = e.clipRect(-99, d ? -b.plotLeft : -b.plotTop, 99, d ? b.chartWidth : b.chartHeight)), b[f] = k = e.clipRect(g), k.count = {
					length: 0
				});
				a && !k.count[this.index] && (k.count[this.index] = !0, k.count.length += 1);
				!1 !== c.clip &&
					(this.group.clip(a || p ? k : b.clipRect), this.markerGroup.clip(q), this.sharedClipKey = f);
				a || (k.count[this.index] && (delete k.count[this.index], --k.count.length), 0 === k.count.length && f && b[f] && (p || (b[f] = b[f].destroy()), b[f + "m"] && (b[f + "m"] = b[f + "m"].destroy())))
			},
			animate: function(a) {
				var b = this.chart,
					c = A(this.options.animation),
					e;
				a ? this.setClip(c) : (e = this.sharedClipKey, (a = b[e]) && a.animate({
					width: b.plotSizeX
				}, c), b[e + "m"] && b[e + "m"].animate({
					width: b.plotSizeX + 99
				}, c), this.animate = null)
			},
			afterAnimate: function() {
				this.setClip();
				k(this, "afterAnimate");
				this.finishedAnimating = !0
			},
			drawPoints: function() {
				var a = this.points,
					b = this.chart,
					c, e, d, f, g = this.options.marker,
					k, q, n, l, m = this[this.specialGroup] || this.markerGroup,
					r = J(g.enabled, this.xAxis.isRadial ? !0 : null, this.closestPointRangePx >= 2 * g.radius);
				if(!1 !== g.enabled || this._hasPointMarkers)
					for(e = 0; e < a.length; e++) d = a[e], c = d.plotY, f = d.graphic, k = d.marker || {}, q = !!d.marker, n = r && void 0 === k.enabled || k.enabled, l = d.isInside, n && v(c) && null !== d.y ? (c = J(k.symbol, this.symbol), d.hasImage = 0 === c.indexOf("url"),
						n = this.markerAttribs(d, d.selected && "select"), f ? f[l ? "show" : "hide"](!0).animate(n) : l && (0 < n.width || d.hasImage) && (d.graphic = f = b.renderer.symbol(c, n.x, n.y, n.width, n.height, q ? k : g).add(m)), f && f.attr(this.pointAttribs(d, d.selected && "select")), f && f.addClass(d.getClassName(), !0)) : f && (d.graphic = f.destroy())
			},
			markerAttribs: function(a, b) {
				var c = this.options.marker,
					e = a.marker || {},
					d = J(e.radius, c.radius);
				b && (c = c.states[b], b = e.states && e.states[b], d = J(b && b.radius, c && c.radius, d + (c && c.radiusPlus || 0)));
				a.hasImage && (d =
					0);
				a = {
					x: Math.floor(a.plotX) - d,
					y: a.plotY - d
				};
				d && (a.width = a.height = 2 * d);
				return a
			},
			pointAttribs: function(a, b) {
				var c = this.options.marker,
					e = a && a.options,
					d = e && e.marker || {},
					f = this.color,
					g = e && e.color,
					p = a && a.color,
					e = J(d.lineWidth, c.lineWidth);
				a = a && a.zone && a.zone.color;
				f = g || a || p || f;
				a = d.fillColor || c.fillColor || f;
				f = d.lineColor || c.lineColor || f;
				b && (c = c.states[b], b = d.states && d.states[b] || {}, e = J(b.lineWidth, c.lineWidth, e + J(b.lineWidthPlus, c.lineWidthPlus, 0)), a = b.fillColor || c.fillColor || a, f = b.lineColor || c.lineColor ||
					f);
				return {
					stroke: f,
					"stroke-width": e,
					fill: a
				}
			},
			destroy: function() {
				var a = this,
					b = a.chart,
					e = /AppleWebKit\/533/.test(K.navigator.userAgent),
					d, h, f = a.data || [],
					n, l;
				k(a, "destroy");
				c(a);
				t(a.axisTypes || [], function(b) {
					(l = a[b]) && l.series && (g(l.series, a), l.isDirty = l.forceRedraw = !0)
				});
				a.legendItem && a.chart.legend.destroyItem(a);
				for(h = f.length; h--;)(n = f[h]) && n.destroy && n.destroy();
				a.points = null;
				clearTimeout(a.animationTimeout);
				D(a, function(a, b) {
					a instanceof q && !a.survive && (d = e && "group" === b ? "hide" : "destroy", a[d]())
				});
				b.hoverSeries === a && (b.hoverSeries = null);
				g(b.series, a);
				b.orderSeries();
				D(a, function(b, c) {
					delete a[c]
				})
			},
			getGraphPath: function(a, b, c) {
				var e = this,
					d = e.options,
					f = d.step,
					g, p = [],
					k = [],
					q;
				a = a || e.points;
				(g = a.reversed) && a.reverse();
				(f = {
					right: 1,
					center: 2
				}[f] || f && 3) && g && (f = 4 - f);
				!d.connectNulls || b || c || (a = this.getValidPoints(a));
				t(a, function(h, g) {
					var n = h.plotX,
						l = h.plotY,
						m = a[g - 1];
					(h.leftCliff || m && m.rightCliff) && !c && (q = !0);
					h.isNull && !u(b) && 0 < g ? q = !d.connectNulls : h.isNull && !b ? q = !0 : (0 === g || q ? g = ["M", h.plotX, h.plotY] : e.getPointSpline ?
						g = e.getPointSpline(a, h, g) : f ? (g = 1 === f ? ["L", m.plotX, l] : 2 === f ? ["L", (m.plotX + n) / 2, m.plotY, "L", (m.plotX + n) / 2, l] : ["L", n, m.plotY], g.push("L", n, l)) : g = ["L", n, l], k.push(h.x), f && k.push(h.x), p.push.apply(p, g), q = !1)
				});
				p.xMap = k;
				return e.graphPath = p
			},
			drawGraph: function() {
				var a = this,
					b = this.options,
					c = (this.gappedPath || this.getGraphPath).call(this),
					e = [
						["graph", "highcharts-graph", b.lineColor || this.color, b.dashStyle]
					];
				t(this.zones, function(c, d) {
					e.push(["zone-graph-" + d, "highcharts-graph highcharts-zone-graph-" + d + " " +
						(c.className || ""), c.color || a.color, c.dashStyle || b.dashStyle
					])
				});
				t(e, function(e, d) {
					var h = e[0],
						f = a[h];
					f ? (f.endX = c.xMap, f.animate({
						d: c
					})) : c.length && (a[h] = a.chart.renderer.path(c).addClass(e[1]).attr({
						zIndex: 1
					}).add(a.group), f = {
						stroke: e[2],
						"stroke-width": b.lineWidth,
						fill: a.fillGraph && a.color || "none"
					}, e[3] ? f.dashstyle = e[3] : "square" !== b.linecap && (f["stroke-linecap"] = f["stroke-linejoin"] = "round"), f = a[h].attr(f).shadow(2 > d && b.shadow));
					f && (f.startX = c.xMap, f.isArea = c.isArea)
				})
			},
			applyZones: function() {
				var a =
					this,
					b = this.chart,
					c = b.renderer,
					e = this.zones,
					d, f, g = this.clips || [],
					k, q = this.graph,
					n = this.area,
					l = Math.max(b.chartWidth, b.chartHeight),
					m = this[(this.zoneAxis || "y") + "Axis"],
					r, v, B = b.inverted,
					y, u, G, D, K = !1;
				e.length && (q || n) && m && void 0 !== m.min && (v = m.reversed, y = m.horiz, q && q.hide(), n && n.hide(), r = m.getExtremes(), t(e, function(e, h) {
					d = v ? y ? b.plotWidth : 0 : y ? 0 : m.toPixels(r.min);
					d = Math.min(Math.max(J(f, d), 0), l);
					f = Math.min(Math.max(Math.round(m.toPixels(J(e.value, r.max), !0)), 0), l);
					K && (d = f = m.toPixels(r.max));
					u = Math.abs(d -
						f);
					G = Math.min(d, f);
					D = Math.max(d, f);
					m.isXAxis ? (k = {
						x: B ? D : G,
						y: 0,
						width: u,
						height: l
					}, y || (k.x = b.plotHeight - k.x)) : (k = {
						x: 0,
						y: B ? D : G,
						width: l,
						height: u
					}, y && (k.y = b.plotWidth - k.y));
					B && c.isVML && (k = m.isXAxis ? {
						x: 0,
						y: v ? G : D,
						height: k.width,
						width: b.chartWidth
					} : {
						x: k.y - b.plotLeft - b.spacingBox.x,
						y: 0,
						width: k.height,
						height: b.chartHeight
					});
					g[h] ? g[h].animate(k) : (g[h] = c.clipRect(k), q && a["zone-graph-" + h].clip(g[h]), n && a["zone-area-" + h].clip(g[h]));
					K = e.value > r.max
				}), this.clips = g)
			},
			invertGroups: function(a) {
				function b() {
					t(["group",
						"markerGroup"
					], function(b) {
						c[b] && (e.renderer.isVML && c[b].attr({
							width: c.yAxis.len,
							height: c.xAxis.len
						}), c[b].width = c.yAxis.len, c[b].height = c.xAxis.len, c[b].invert(a))
					})
				}
				var c = this,
					e = c.chart,
					d;
				c.xAxis && (d = C(e, "resize", b), C(c, "destroy", d), b(a), c.invertGroups = b)
			},
			plotGroup: function(a, b, c, e, d) {
				var h = this[a],
					f = !h;
				f && (this[a] = h = this.chart.renderer.g().attr({
					zIndex: e || .1
				}).add(d));
				h.addClass("highcharts-" + b + " highcharts-series-" + this.index + " highcharts-" + this.type + "-series highcharts-color-" + this.colorIndex +
					" " + (this.options.className || ""), !0);
				h.attr({
					visibility: c
				})[f ? "attr" : "animate"](this.getPlotBox());
				return h
			},
			getPlotBox: function() {
				var a = this.chart,
					b = this.xAxis,
					c = this.yAxis;
				a.inverted && (b = c, c = this.xAxis);
				return {
					translateX: b ? b.left : a.plotLeft,
					translateY: c ? c.top : a.plotTop,
					scaleX: 1,
					scaleY: 1
				}
			},
			render: function() {
				var a = this,
					b = a.chart,
					c, e = a.options,
					d = !!a.animate && b.renderer.isSVG && A(e.animation).duration,
					f = a.visible ? "inherit" : "hidden",
					g = e.zIndex,
					k = a.hasRendered,
					q = b.seriesGroup,
					n = b.inverted;
				c = a.plotGroup("group",
					"series", f, g, q);
				a.markerGroup = a.plotGroup("markerGroup", "markers", f, g, q);
				d && a.animate(!0);
				c.inverted = a.isCartesian ? n : !1;
				a.drawGraph && (a.drawGraph(), a.applyZones());
				a.drawDataLabels && a.drawDataLabels();
				a.visible && a.drawPoints();
				a.drawTracker && !1 !== a.options.enableMouseTracking && a.drawTracker();
				a.invertGroups(n);
				!1 === e.clip || a.sharedClipKey || k || c.clip(b.clipRect);
				d && a.animate();
				k || (a.animationTimeout = B(function() {
					a.afterAnimate()
				}, d));
				a.isDirty = !1;
				a.hasRendered = !0
			},
			redraw: function() {
				var a = this.chart,
					b = this.isDirty || this.isDirtyData,
					c = this.group,
					e = this.xAxis,
					d = this.yAxis;
				c && (a.inverted && c.attr({
					width: a.plotWidth,
					height: a.plotHeight
				}), c.animate({
					translateX: J(e && e.left, a.plotLeft),
					translateY: J(d && d.top, a.plotTop)
				}));
				this.translate();
				this.render();
				b && delete this.kdTree
			},
			kdAxisArray: ["clientX", "plotY"],
			searchPoint: function(a, b) {
				var c = this.xAxis,
					e = this.yAxis,
					d = this.chart.inverted;
				return this.searchKDTree({
					clientX: d ? c.len - a.chartY + c.pos : a.chartX - c.pos,
					plotY: d ? e.len - a.chartX + e.pos : a.chartY - e.pos
				}, b)
			},
			buildKDTree: function() {
				function a(c, e, d) {
					var h, f;
					if(f = c && c.length) return h = b.kdAxisArray[e % d], c.sort(function(a, b) {
						return a[h] - b[h]
					}), f = Math.floor(f / 2), {
						point: c[f],
						left: a(c.slice(0, f), e + 1, d),
						right: a(c.slice(f + 1), e + 1, d)
					}
				}
				this.buildingKdTree = !0;
				var b = this,
					c = -1 < b.options.findNearestPointBy.indexOf("y") ? 2 : 1;
				delete b.kdTree;
				B(function() {
					b.kdTree = a(b.getValidPoints(null, !b.directTouch), c, c);
					b.buildingKdTree = !1
				}, b.options.kdNow ? 0 : 1)
			},
			searchKDTree: function(a, b) {
				function c(a, b, h, k) {
					var p = b.point,
						q = e.kdAxisArray[h %
							k],
						n, l, m = p;
					l = u(a[d]) && u(p[d]) ? Math.pow(a[d] - p[d], 2) : null;
					n = u(a[f]) && u(p[f]) ? Math.pow(a[f] - p[f], 2) : null;
					n = (l || 0) + (n || 0);
					p.dist = u(n) ? Math.sqrt(n) : Number.MAX_VALUE;
					p.distX = u(l) ? Math.sqrt(l) : Number.MAX_VALUE;
					q = a[q] - p[q];
					n = 0 > q ? "left" : "right";
					l = 0 > q ? "right" : "left";
					b[n] && (n = c(a, b[n], h + 1, k), m = n[g] < m[g] ? n : p);
					b[l] && Math.sqrt(q * q) < m[g] && (a = c(a, b[l], h + 1, k), m = a[g] < m[g] ? a : m);
					return m
				}
				var e = this,
					d = this.kdAxisArray[0],
					f = this.kdAxisArray[1],
					g = b ? "distX" : "dist";
				b = -1 < e.options.findNearestPointBy.indexOf("y") ? 2 : 1;
				this.kdTree ||
					this.buildingKdTree || this.buildKDTree();
				if(this.kdTree) return c(a, this.kdTree, b, b)
			}
		})
	})(M);
	(function(a) {
		var C = a.Axis,
			A = a.Chart,
			F = a.correctFloat,
			E = a.defined,
			m = a.destroyObjectProperties,
			f = a.each,
			l = a.format,
			r = a.objectEach,
			u = a.pick,
			t = a.Series;
		a.StackItem = function(a, d, f, b, e) {
			var g = a.chart.inverted;
			this.axis = a;
			this.isNegative = f;
			this.options = d;
			this.x = b;
			this.total = null;
			this.points = {};
			this.stack = e;
			this.rightCliff = this.leftCliff = 0;
			this.alignOptions = {
				align: d.align || (g ? f ? "left" : "right" : "center"),
				verticalAlign: d.verticalAlign ||
					(g ? "middle" : f ? "bottom" : "top"),
				y: u(d.y, g ? 4 : f ? 14 : -6),
				x: u(d.x, g ? f ? -6 : 6 : 0)
			};
			this.textAlign = d.textAlign || (g ? f ? "right" : "left" : "center")
		};
		a.StackItem.prototype = {
			destroy: function() {
				m(this, this.axis)
			},
			render: function(a) {
				var d = this.options,
					f = d.format,
					f = f ? l(f, this) : d.formatter.call(this);
				this.label ? this.label.attr({
					text: f,
					visibility: "hidden"
				}) : this.label = this.axis.chart.renderer.text(f, null, null, d.useHTML).css(d.style).attr({
					align: this.textAlign,
					rotation: d.rotation,
					visibility: "hidden"
				}).add(a)
			},
			setOffset: function(a,
				d) {
				var f = this.axis,
					b = f.chart,
					e = f.translate(f.usePercentage ? 100 : this.total, 0, 0, 0, 1),
					f = f.translate(0),
					f = Math.abs(e - f);
				a = b.xAxis[0].translate(this.x) + a;
				e = this.getStackBox(b, this, a, e, d, f);
				if(d = this.label) d.align(this.alignOptions, null, e), e = d.alignAttr, d[!1 === this.options.crop || b.isInsidePlot(e.x, e.y) ? "show" : "hide"](!0)
			},
			getStackBox: function(a, d, f, b, e, l) {
				var g = d.axis.reversed,
					k = a.inverted;
				a = a.plotHeight;
				d = d.isNegative && !g || !d.isNegative && g;
				return {
					x: k ? d ? b : b - l : f,
					y: k ? a - f - e : d ? a - b - l : a - b,
					width: k ? l : e,
					height: k ?
						e : l
				}
			}
		};
		A.prototype.getStacks = function() {
			var a = this;
			f(a.yAxis, function(a) {
				a.stacks && a.hasVisibleSeries && (a.oldStacks = a.stacks)
			});
			f(a.series, function(d) {
				!d.options.stacking || !0 !== d.visible && !1 !== a.options.chart.ignoreHiddenSeries || (d.stackKey = d.type + u(d.options.stack, ""))
			})
		};
		C.prototype.buildStacks = function() {
			var a = this.series,
				d = u(this.options.reversedStacks, !0),
				f = a.length,
				b;
			if(!this.isXAxis) {
				this.usePercentage = !1;
				for(b = f; b--;) a[d ? b : f - b - 1].setStackedPoints();
				if(this.usePercentage)
					for(b = 0; b < f; b++) a[b].setPercentStacks()
			}
		};
		C.prototype.renderStackTotals = function() {
			var a = this.chart,
				d = a.renderer,
				f = this.stacks,
				b = this.stackTotalGroup;
			b || (this.stackTotalGroup = b = d.g("stack-labels").attr({
				visibility: "visible",
				zIndex: 6
			}).add());
			b.translate(a.plotLeft, a.plotTop);
			r(f, function(a) {
				r(a, function(a) {
					a.render(b)
				})
			})
		};
		C.prototype.resetStacks = function() {
			var a = this,
				d = a.stacks;
			a.isXAxis || r(d, function(d) {
				r(d, function(b, e) {
					b.touched < a.stacksTouched ? (b.destroy(), delete d[e]) : (b.total = null, b.cum = null)
				})
			})
		};
		C.prototype.cleanStacks = function() {
			var a;
			this.isXAxis || (this.oldStacks && (a = this.stacks = this.oldStacks), r(a, function(a) {
				r(a, function(a) {
					a.cum = a.total
				})
			}))
		};
		t.prototype.setStackedPoints = function() {
			if(this.options.stacking && (!0 === this.visible || !1 === this.chart.options.chart.ignoreHiddenSeries)) {
				var f = this.processedXData,
					d = this.processedYData,
					k = [],
					b = d.length,
					e = this.options,
					l = e.threshold,
					m = e.startFromThreshold ? l : 0,
					n = e.stack,
					e = e.stacking,
					r = this.stackKey,
					t = "-" + r,
					c = this.negStacks,
					G = this.yAxis,
					q = G.stacks,
					B = G.oldStacks,
					K, p, z, I, A, h, w;
				G.stacksTouched +=
					1;
				for(A = 0; A < b; A++) h = f[A], w = d[A], K = this.getStackIndicator(K, h, this.index), I = K.key, z = (p = c && w < (m ? 0 : l)) ? t : r, q[z] || (q[z] = {}), q[z][h] || (B[z] && B[z][h] ? (q[z][h] = B[z][h], q[z][h].total = null) : q[z][h] = new a.StackItem(G, G.options.stackLabels, p, h, n)), z = q[z][h], null !== w && (z.points[I] = z.points[this.index] = [u(z.cum, m)], E(z.cum) || (z.base = I), z.touched = G.stacksTouched, 0 < K.index && !1 === this.singleStacks && (z.points[I][0] = z.points[this.index + "," + h + ",0"][0])), "percent" === e ? (p = p ? r : t, c && q[p] && q[p][h] ? (p = q[p][h], z.total = p.total =
					Math.max(p.total, z.total) + Math.abs(w) || 0) : z.total = F(z.total + (Math.abs(w) || 0))) : z.total = F(z.total + (w || 0)), z.cum = u(z.cum, m) + (w || 0), null !== w && (z.points[I].push(z.cum), k[A] = z.cum);
				"percent" === e && (G.usePercentage = !0);
				this.stackedYData = k;
				G.oldStacks = {}
			}
		};
		t.prototype.setPercentStacks = function() {
			var a = this,
				d = a.stackKey,
				k = a.yAxis.stacks,
				b = a.processedXData,
				e;
			f([d, "-" + d], function(d) {
				for(var f = b.length, g, l; f--;)
					if(g = b[f], e = a.getStackIndicator(e, g, a.index, d), g = (l = k[d] && k[d][g]) && l.points[e.key]) l = l.total ? 100 /
						l.total : 0, g[0] = F(g[0] * l), g[1] = F(g[1] * l), a.stackedYData[f] = g[1]
			})
		};
		t.prototype.getStackIndicator = function(a, d, f, b) {
			!E(a) || a.x !== d || b && a.key !== b ? a = {
				x: d,
				index: 0,
				key: b
			} : a.index++;
			a.key = [f, d, a.index].join();
			return a
		}
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.animate,
			F = a.Axis,
			E = a.createElement,
			m = a.css,
			f = a.defined,
			l = a.each,
			r = a.erase,
			u = a.extend,
			t = a.fireEvent,
			g = a.inArray,
			d = a.isNumber,
			k = a.isObject,
			b = a.isArray,
			e = a.merge,
			v = a.objectEach,
			y = a.pick,
			n = a.Point,
			D = a.Series,
			J = a.seriesTypes,
			c = a.setAnimation,
			G = a.splat;
		u(a.Chart.prototype, {
			addSeries: function(a, b, c) {
				var e, d = this;
				a && (b = y(b, !0), t(d, "addSeries", {
					options: a
				}, function() {
					e = d.initSeries(a);
					d.isDirtyLegend = !0;
					d.linkSeries();
					b && d.redraw(c)
				}));
				return e
			},
			addAxis: function(a, b, c, d) {
				var f = b ? "xAxis" : "yAxis",
					g = this.options;
				a = e(a, {
					index: this[f].length,
					isX: b
				});
				b = new F(this, a);
				g[f] = G(g[f] || {});
				g[f].push(a);
				y(c, !0) && this.redraw(d);
				return b
			},
			showLoading: function(a) {
				var b = this,
					c = b.options,
					e = b.loadingDiv,
					d = c.loading,
					f = function() {
						e && m(e, {
							left: b.plotLeft + "px",
							top: b.plotTop + "px",
							width: b.plotWidth +
								"px",
							height: b.plotHeight + "px"
						})
					};
				e || (b.loadingDiv = e = E("div", {
					className: "highcharts-loading highcharts-loading-hidden"
				}, null, b.container), b.loadingSpan = E("span", {
					className: "highcharts-loading-inner"
				}, null, e), C(b, "redraw", f));
				e.className = "highcharts-loading";
				b.loadingSpan.innerHTML = a || c.lang.loading;
				m(e, u(d.style, {
					zIndex: 10
				}));
				m(b.loadingSpan, d.labelStyle);
				b.loadingShown || (m(e, {
					opacity: 0,
					display: ""
				}), A(e, {
					opacity: d.style.opacity || .5
				}, {
					duration: d.showDuration || 0
				}));
				b.loadingShown = !0;
				f()
			},
			hideLoading: function() {
				var a =
					this.options,
					b = this.loadingDiv;
				b && (b.className = "highcharts-loading highcharts-loading-hidden", A(b, {
					opacity: 0
				}, {
					duration: a.loading.hideDuration || 100,
					complete: function() {
						m(b, {
							display: "none"
						})
					}
				}));
				this.loadingShown = !1
			},
			propsRequireDirtyBox: "backgroundColor borderColor borderWidth margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow".split(" "),
			propsRequireUpdateSeries: "chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions tooltip".split(" "),
			update: function(a, b, c) {
				var k = this,
					n = {
						credits: "addCredits",
						title: "setTitle",
						subtitle: "setSubtitle"
					},
					q = a.chart,
					m, h, r = [];
				if(q) {
					e(!0, k.options.chart, q);
					"className" in q && k.setClassName(q.className);
					if("inverted" in q || "polar" in q) k.propFromSeries(), m = !0;
					"alignTicks" in q && (m = !0);
					v(q, function(a, b) {
						-1 !== g("chart." + b, k.propsRequireUpdateSeries) && (h = !0); - 1 !== g(b, k.propsRequireDirtyBox) &&
							(k.isDirtyBox = !0)
					});
					"style" in q && k.renderer.setStyle(q.style)
				}
				a.colors && (this.options.colors = a.colors);
				a.plotOptions && e(!0, this.options.plotOptions, a.plotOptions);
				v(a, function(a, b) {
					if(k[b] && "function" === typeof k[b].update) k[b].update(a, !1);
					else if("function" === typeof k[n[b]]) k[n[b]](a);
					"chart" !== b && -1 !== g(b, k.propsRequireUpdateSeries) && (h = !0)
				});
				l("xAxis yAxis zAxis series colorAxis pane".split(" "), function(b) {
					a[b] && (l(G(a[b]), function(a, e) {
						(e = f(a.id) && k.get(a.id) || k[b][e]) && e.coll === b && (e.update(a, !1), c && (e.touched = !0));
						if(!e && c)
							if("series" === b) k.addSeries(a, !1).touched = !0;
							else if("xAxis" === b || "yAxis" === b) k.addAxis(a, "xAxis" === b, !1).touched = !0
					}), c && l(k[b], function(a) {
						a.touched ? delete a.touched : r.push(a)
					}))
				});
				l(r, function(a) {
					a.remove(!1)
				});
				m && l(k.axes, function(a) {
					a.update({}, !1)
				});
				h && l(k.series, function(a) {
					a.update({}, !1)
				});
				a.loading && e(!0, k.options.loading, a.loading);
				m = q && q.width;
				q = q && q.height;
				d(m) && m !== k.chartWidth || d(q) && q !== k.chartHeight ? k.setSize(m, q) : y(b, !0) && k.redraw()
			},
			setSubtitle: function(a) {
				this.setTitle(void 0,
					a)
			}
		});
		u(n.prototype, {
			update: function(a, b, c, e) {
				function d() {
					f.applyOptions(a);
					null === f.y && h && (f.graphic = h.destroy());
					k(a, !0) && (h && h.element && a && a.marker && void 0 !== a.marker.symbol && (f.graphic = h.destroy()), a && a.dataLabels && f.dataLabel && (f.dataLabel = f.dataLabel.destroy()));
					p = f.index;
					g.updateParallelArrays(f, p);
					q.data[p] = k(q.data[p], !0) || k(a, !0) ? f.options : a;
					g.isDirty = g.isDirtyData = !0;
					!g.fixedBox && g.hasCartesianSeries && (l.isDirtyBox = !0);
					"point" === q.legendType && (l.isDirtyLegend = !0);
					b && l.redraw(c)
				}
				var f =
					this,
					g = f.series,
					h = f.graphic,
					p, l = g.chart,
					q = g.options;
				b = y(b, !0);
				!1 === e ? d() : f.firePointEvent("update", {
					options: a
				}, d)
			},
			remove: function(a, b) {
				this.series.removePoint(g(this, this.series.data), a, b)
			}
		});
		u(D.prototype, {
			addPoint: function(a, b, c, e) {
				var d = this.options,
					f = this.data,
					g = this.chart,
					h = this.xAxis,
					h = h && h.hasNames && h.names,
					k = d.data,
					p, l, q = this.xData,
					n, m;
				b = y(b, !0);
				p = {
					series: this
				};
				this.pointClass.prototype.applyOptions.apply(p, [a]);
				m = p.x;
				n = q.length;
				if(this.requireSorting && m < q[n - 1])
					for(l = !0; n && q[n - 1] > m;) n--;
				this.updateParallelArrays(p, "splice", n, 0, 0);
				this.updateParallelArrays(p, n);
				h && p.name && (h[m] = p.name);
				k.splice(n, 0, a);
				l && (this.data.splice(n, 0, null), this.processData());
				"point" === d.legendType && this.generatePoints();
				c && (f[0] && f[0].remove ? f[0].remove(!1) : (f.shift(), this.updateParallelArrays(p, "shift"), k.shift()));
				this.isDirtyData = this.isDirty = !0;
				b && g.redraw(e)
			},
			removePoint: function(a, b, e) {
				var d = this,
					f = d.data,
					g = f[a],
					k = d.points,
					h = d.chart,
					l = function() {
						k && k.length === f.length && k.splice(a, 1);
						f.splice(a, 1);
						d.options.data.splice(a, 1);
						d.updateParallelArrays(g || {
							series: d
						}, "splice", a, 1);
						g && g.destroy();
						d.isDirty = !0;
						d.isDirtyData = !0;
						b && h.redraw()
					};
				c(e, h);
				b = y(b, !0);
				g ? g.firePointEvent("remove", null, l) : l()
			},
			remove: function(a, b, c) {
				function e() {
					d.destroy();
					f.isDirtyLegend = f.isDirtyBox = !0;
					f.linkSeries();
					y(a, !0) && f.redraw(b)
				}
				var d = this,
					f = d.chart;
				!1 !== c ? t(d, "remove", null, e) : e()
			},
			update: function(a, b) {
				var c = this,
					d = c.chart,
					f = c.userOptions,
					g = c.oldType || c.type,
					k = a.type || f.type || d.options.chart.type,
					h = J[g].prototype,
					n,
					q = ["group", "markerGroup", "dataLabelsGroup", "navigatorSeries", "baseSeries"],
					m = c.finishedAnimating && {
						animation: !1
					};
				if(Object.keys && "data" === Object.keys(a).toString()) return this.setData(a.data, b);
				if(k && k !== g || void 0 !== a.zIndex) q.length = 0;
				l(q, function(a) {
					q[a] = c[a];
					delete c[a]
				});
				a = e(f, m, {
					index: c.index,
					pointStart: c.xData[0]
				}, {
					data: c.options.data
				}, a);
				c.remove(!1, null, !1);
				for(n in h) c[n] = void 0;
				u(c, J[k || g].prototype);
				l(q, function(a) {
					c[a] = q[a]
				});
				c.init(d, a);
				c.oldType = g;
				d.linkSeries();
				y(b, !0) && d.redraw(!1)
			}
		});
		u(F.prototype, {
			update: function(a, b) {
				var c = this.chart;
				a = c.options[this.coll][this.options.index] = e(this.userOptions, a);
				this.destroy(!0);
				this.init(c, u(a, {
					events: void 0
				}));
				c.isDirtyBox = !0;
				y(b, !0) && c.redraw()
			},
			remove: function(a) {
				for(var c = this.chart, e = this.coll, d = this.series, f = d.length; f--;) d[f] && d[f].remove(!1);
				r(c.axes, this);
				r(c[e], this);
				b(c.options[e]) ? c.options[e].splice(this.options.index, 1) : delete c.options[e];
				l(c[e], function(a, b) {
					a.options.index = b
				});
				this.destroy();
				c.isDirtyBox = !0;
				y(a, !0) && c.redraw()
			},
			setTitle: function(a, b) {
				this.update({
					title: a
				}, b)
			},
			setCategories: function(a, b) {
				this.update({
					categories: a
				}, b)
			}
		})
	})(M);
	(function(a) {
		var C = a.color,
			A = a.each,
			F = a.map,
			E = a.pick,
			m = a.Series,
			f = a.seriesType;
		f("area", "line", {
			softThreshold: !1,
			threshold: 0
		}, {
			singleStacks: !1,
			getStackPoints: function(f) {
				var l = [],
					m = [],
					t = this.xAxis,
					g = this.yAxis,
					d = g.stacks[this.stackKey],
					k = {},
					b = this.index,
					e = g.series,
					v = e.length,
					y, n = E(g.options.reversedStacks, !0) ? 1 : -1,
					D;
				f = f || this.points;
				if(this.options.stacking) {
					for(D = 0; D < f.length; D++) k[f[D].x] =
						f[D];
					a.objectEach(d, function(a, b) {
						null !== a.total && m.push(b)
					});
					m.sort(function(a, b) {
						return a - b
					});
					y = F(e, function() {
						return this.visible
					});
					A(m, function(a, c) {
						var e = 0,
							f, r;
						if(k[a] && !k[a].isNull) l.push(k[a]), A([-1, 1], function(e) {
							var g = 1 === e ? "rightNull" : "leftNull",
								l = 0,
								q = d[m[c + e]];
							if(q)
								for(D = b; 0 <= D && D < v;) f = q.points[D], f || (D === b ? k[a][g] = !0 : y[D] && (r = d[a].points[D]) && (l -= r[1] - r[0])), D += n;
							k[a][1 === e ? "rightCliff" : "leftCliff"] = l
						});
						else {
							for(D = b; 0 <= D && D < v;) {
								if(f = d[a].points[D]) {
									e = f[1];
									break
								}
								D += n
							}
							e = g.translate(e, 0,
								1, 0, 1);
							l.push({
								isNull: !0,
								plotX: t.translate(a, 0, 0, 0, 1),
								x: a,
								plotY: e,
								yBottom: e
							})
						}
					})
				}
				return l
			},
			getGraphPath: function(a) {
				var f = m.prototype.getGraphPath,
					l = this.options,
					t = l.stacking,
					g = this.yAxis,
					d, k, b = [],
					e = [],
					v = this.index,
					y, n = g.stacks[this.stackKey],
					D = l.threshold,
					A = g.getThreshold(l.threshold),
					c, l = l.connectNulls || "percent" === t,
					G = function(c, d, f) {
						var k = a[c];
						c = t && n[k.x].points[v];
						var l = k[f + "Null"] || 0;
						f = k[f + "Cliff"] || 0;
						var q, m, k = !0;
						f || l ? (q = (l ? c[0] : c[1]) + f, m = c[0] + f, k = !!l) : !t && a[d] && a[d].isNull && (q = m = D);
						void 0 !==
							q && (e.push({
								plotX: y,
								plotY: null === q ? A : g.getThreshold(q),
								isNull: k,
								isCliff: !0
							}), b.push({
								plotX: y,
								plotY: null === m ? A : g.getThreshold(m),
								doCurve: !1
							}))
					};
				a = a || this.points;
				t && (a = this.getStackPoints(a));
				for(d = 0; d < a.length; d++)
					if(k = a[d].isNull, y = E(a[d].rectPlotX, a[d].plotX), c = E(a[d].yBottom, A), !k || l) l || G(d, d - 1, "left"), k && !t && l || (e.push(a[d]), b.push({
						x: d,
						plotX: y,
						plotY: c
					})), l || G(d, d + 1, "right");
				d = f.call(this, e, !0, !0);
				b.reversed = !0;
				k = f.call(this, b, !0, !0);
				k.length && (k[0] = "L");
				k = d.concat(k);
				f = f.call(this, e, !1, l);
				k.xMap =
					d.xMap;
				this.areaPath = k;
				return f
			},
			drawGraph: function() {
				this.areaPath = [];
				m.prototype.drawGraph.apply(this);
				var a = this,
					f = this.areaPath,
					u = this.options,
					t = [
						["area", "highcharts-area", this.color, u.fillColor]
					];
				A(this.zones, function(f, d) {
					t.push(["zone-area-" + d, "highcharts-area highcharts-zone-area-" + d + " " + f.className, f.color || a.color, f.fillColor || u.fillColor])
				});
				A(t, function(g) {
					var d = g[0],
						k = a[d];
					k ? (k.endX = f.xMap, k.animate({
						d: f
					})) : (k = a[d] = a.chart.renderer.path(f).addClass(g[1]).attr({
						fill: E(g[3], C(g[2]).setOpacity(E(u.fillOpacity,
							.75)).get()),
						zIndex: 0
					}).add(a.group), k.isArea = !0);
					k.startX = f.xMap;
					k.shiftUnit = u.step ? 2 : 1
				})
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
		})
	})(M);
	(function(a) {
		var C = a.pick;
		a = a.seriesType;
		a("spline", "line", {}, {
			getPointSpline: function(a, F, E) {
				var m = F.plotX,
					f = F.plotY,
					l = a[E - 1];
				E = a[E + 1];
				var r, u, t, g;
				if(l && !l.isNull && !1 !== l.doCurve && !F.isCliff && E && !E.isNull && !1 !== E.doCurve && !F.isCliff) {
					a = l.plotY;
					t = E.plotX;
					E = E.plotY;
					var d = 0;
					r = (1.5 * m + l.plotX) / 2.5;
					u = (1.5 * f + a) / 2.5;
					t = (1.5 * m + t) / 2.5;
					g = (1.5 * f + E) / 2.5;
					t !== r && (d =
						(g - u) * (t - m) / (t - r) + f - g);
					u += d;
					g += d;
					u > a && u > f ? (u = Math.max(a, f), g = 2 * f - u) : u < a && u < f && (u = Math.min(a, f), g = 2 * f - u);
					g > E && g > f ? (g = Math.max(E, f), u = 2 * f - g) : g < E && g < f && (g = Math.min(E, f), u = 2 * f - g);
					F.rightContX = t;
					F.rightContY = g
				}
				F = ["C", C(l.rightContX, l.plotX), C(l.rightContY, l.plotY), C(r, m), C(u, f), m, f];
				l.rightContX = l.rightContY = null;
				return F
			}
		})
	})(M);
	(function(a) {
		var C = a.seriesTypes.area.prototype,
			A = a.seriesType;
		A("areaspline", "spline", a.defaultPlotOptions.area, {
			getStackPoints: C.getStackPoints,
			getGraphPath: C.getGraphPath,
			drawGraph: C.drawGraph,
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle
		})
	})(M);
	(function(a) {
		var C = a.animObject,
			A = a.color,
			F = a.each,
			E = a.extend,
			m = a.isNumber,
			f = a.merge,
			l = a.pick,
			r = a.Series,
			u = a.seriesType,
			t = a.svg;
		u("column", "line", {
			borderRadius: 0,
			crisp: !0,
			groupPadding: .2,
			marker: null,
			pointPadding: .1,
			minPointLength: 0,
			cropThreshold: 50,
			pointRange: null,
			states: {
				hover: {
					halo: !1,
					brightness: .1,
					shadow: !1
				},
				select: {
					color: "#cccccc",
					borderColor: "#000000",
					shadow: !1
				}
			},
			dataLabels: {
				align: null,
				verticalAlign: null,
				y: null
			},
			softThreshold: !1,
			startFromThreshold: !0,
			stickyTracking: !1,
			tooltip: {
				distance: 6
			},
			threshold: 0,
			borderColor: "#ffffff"
		}, {
			cropShoulder: 0,
			directTouch: !0,
			trackerGroups: ["group", "dataLabelsGroup"],
			negStacks: !0,
			init: function() {
				r.prototype.init.apply(this, arguments);
				var a = this,
					d = a.chart;
				d.hasRendered && F(d.series, function(d) {
					d.type === a.type && (d.isDirty = !0)
				})
			},
			getColumnMetrics: function() {
				var a = this,
					d = a.options,
					f = a.xAxis,
					b = a.yAxis,
					e = f.reversed,
					m, r = {},
					n = 0;
				!1 === d.grouping ? n = 1 : F(a.chart.series, function(c) {
					var e = c.options,
						d = c.yAxis,
						f;
					c.type !== a.type || !c.visible && a.chart.options.chart.ignoreHiddenSeries || b.len !== d.len || b.pos !== d.pos || (e.stacking ? (m = c.stackKey, void 0 === r[m] && (r[m] = n++), f = r[m]) : !1 !== e.grouping && (f = n++), c.columnIndex = f)
				});
				var t = Math.min(Math.abs(f.transA) * (f.ordinalSlope || d.pointRange || f.closestPointRange || f.tickInterval || 1), f.len),
					u = t * d.groupPadding,
					c = (t - 2 * u) / (n || 1),
					d = Math.min(d.maxPointWidth || f.len, l(d.pointWidth, c * (1 - 2 * d.pointPadding)));
				a.columnMetrics = {
					width: d,
					offset: (c - d) / 2 + (u + ((a.columnIndex || 0) +
						(e ? 1 : 0)) * c - t / 2) * (e ? -1 : 1)
				};
				return a.columnMetrics
			},
			crispCol: function(a, d, f, b) {
				var e = this.chart,
					g = this.borderWidth,
					k = -(g % 2 ? .5 : 0),
					g = g % 2 ? .5 : 1;
				e.inverted && e.renderer.isVML && (g += 1);
				this.options.crisp && (f = Math.round(a + f) + k, a = Math.round(a) + k, f -= a);
				b = Math.round(d + b) + g;
				k = .5 >= Math.abs(d) && .5 < b;
				d = Math.round(d) + g;
				b -= d;
				k && b && (--d, b += 1);
				return {
					x: a,
					y: d,
					width: f,
					height: b
				}
			},
			translate: function() {
				var a = this,
					d = a.chart,
					f = a.options,
					b = a.dense = 2 > a.closestPointRange * a.xAxis.transA,
					b = a.borderWidth = l(f.borderWidth, b ? 0 : 1),
					e = a.yAxis,
					m = a.translatedThreshold = e.getThreshold(f.threshold),
					t = l(f.minPointLength, 5),
					n = a.getColumnMetrics(),
					u = n.width,
					A = a.barW = Math.max(u, 1 + 2 * b),
					c = a.pointXOffset = n.offset;
				d.inverted && (m -= .5);
				f.pointPadding && (A = Math.ceil(A));
				r.prototype.translate.apply(a);
				F(a.points, function(b) {
					var f = l(b.yBottom, m),
						g = 999 + Math.abs(f),
						g = Math.min(Math.max(-g, b.plotY), e.len + g),
						k = b.plotX + c,
						n = A,
						r = Math.min(g, f),
						v, y = Math.max(g, f) - r;
					Math.abs(y) < t && t && (y = t, v = !e.reversed && !b.negative || e.reversed && b.negative, r = Math.abs(r - m) > t ? f - t : m - (v ?
						t : 0));
					b.barX = k;
					b.pointWidth = u;
					b.tooltipPos = d.inverted ? [e.len + e.pos - d.plotLeft - g, a.xAxis.len - k - n / 2, y] : [k + n / 2, g + e.pos - d.plotTop, y];
					b.shapeType = "rect";
					b.shapeArgs = a.crispCol.apply(a, b.isNull ? [k, m, n, 0] : [k, r, n, y])
				})
			},
			getSymbol: a.noop,
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle,
			drawGraph: function() {
				this.group[this.dense ? "addClass" : "removeClass"]("highcharts-dense-data")
			},
			pointAttribs: function(a, d) {
				var g = this.options,
					b, e = this.pointAttrToOptions || {};
				b = e.stroke || "borderColor";
				var l = e["stroke-width"] ||
					"borderWidth",
					m = a && a.color || this.color,
					n = a[b] || g[b] || this.color || m,
					r = a[l] || g[l] || this[l] || 0,
					e = g.dashStyle;
				a && this.zones.length && (m = a.getZone(), m = a.options.color || m && m.color || this.color);
				d && (a = f(g.states[d], a.options.states && a.options.states[d] || {}), d = a.brightness, m = a.color || void 0 !== d && A(m).brighten(a.brightness).get() || m, n = a[b] || n, r = a[l] || r, e = a.dashStyle || e);
				b = {
					fill: m,
					stroke: n,
					"stroke-width": r
				};
				e && (b.dashstyle = e);
				return b
			},
			drawPoints: function() {
				var a = this,
					d = this.chart,
					k = a.options,
					b = d.renderer,
					e =
					k.animationLimit || 250,
					l;
				F(a.points, function(g) {
					var n = g.graphic;
					if(m(g.plotY) && null !== g.y) {
						l = g.shapeArgs;
						if(n) n[d.pointCount < e ? "animate" : "attr"](f(l));
						else g.graphic = n = b[g.shapeType](l).add(g.group || a.group);
						k.borderRadius && n.attr({
							r: k.borderRadius
						});
						n.attr(a.pointAttribs(g, g.selected && "select")).shadow(k.shadow, null, k.stacking && !k.borderRadius);
						n.addClass(g.getClassName(), !0)
					} else n && (g.graphic = n.destroy())
				})
			},
			animate: function(a) {
				var d = this,
					f = this.yAxis,
					b = d.options,
					e = this.chart.inverted,
					g = {};
				t && (a ?
					(g.scaleY = .001, a = Math.min(f.pos + f.len, Math.max(f.pos, f.toPixels(b.threshold))), e ? g.translateX = a - f.len : g.translateY = a, d.group.attr(g)) : (g[e ? "translateX" : "translateY"] = f.pos, d.group.animate(g, E(C(d.options.animation), {
						step: function(a, b) {
							d.group.attr({
								scaleY: Math.max(.001, b.pos)
							})
						}
					})), d.animate = null))
			},
			remove: function() {
				var a = this,
					d = a.chart;
				d.hasRendered && F(d.series, function(d) {
					d.type === a.type && (d.isDirty = !0)
				});
				r.prototype.remove.apply(a, arguments)
			}
		})
	})(M);
	(function(a) {
		a = a.seriesType;
		a("bar", "column",
			null, {
				inverted: !0
			})
	})(M);
	(function(a) {
		var C = a.Series;
		a = a.seriesType;
		a("scatter", "line", {
			lineWidth: 0,
			findNearestPointBy: "xy",
			marker: {
				enabled: !0
			},
			tooltip: {
				headerFormat: '\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cspan style\x3d"font-size: 0.85em"\x3e {series.name}\x3c/span\x3e\x3cbr/\x3e',
				pointFormat: "x: \x3cb\x3e{point.x}\x3c/b\x3e\x3cbr/\x3ey: \x3cb\x3e{point.y}\x3c/b\x3e\x3cbr/\x3e"
			}
		}, {
			sorted: !1,
			requireSorting: !1,
			noSharedTooltip: !0,
			trackerGroups: ["group", "markerGroup", "dataLabelsGroup"],
			takeOrdinalPosition: !1,
			drawGraph: function() {
				this.options.lineWidth && C.prototype.drawGraph.call(this)
			}
		})
	})(M);
	(function(a) {
		var C = a.pick,
			A = a.relativeLength;
		a.CenteredSeriesMixin = {
			getCenter: function() {
				var a = this.options,
					E = this.chart,
					m = 2 * (a.slicedOffset || 0),
					f = E.plotWidth - 2 * m,
					E = E.plotHeight - 2 * m,
					l = a.center,
					l = [C(l[0], "50%"), C(l[1], "50%"), a.size || "100%", a.innerSize || 0],
					r = Math.min(f, E),
					u, t;
				for(u = 0; 4 > u; ++u) t = l[u], a = 2 > u || 2 === u && /%$/.test(t), l[u] = A(t, [f, E, r, l[2]][u]) + (a ? m : 0);
				l[3] > l[2] && (l[3] = l[2]);
				return l
			}
		}
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.defined,
			F = a.each,
			E = a.extend,
			m = a.inArray,
			f = a.noop,
			l = a.pick,
			r = a.Point,
			u = a.Series,
			t = a.seriesType,
			g = a.setAnimation;
		t("pie", "line", {
			center: [null, null],
			clip: !1,
			colorByPoint: !0,
			dataLabels: {
				distance: 30,
				enabled: !0,
				formatter: function() {
					return this.point.isNull ? void 0 : this.point.name
				},
				x: 0
			},
			ignoreHiddenPoint: !0,
			legendType: "point",
			marker: null,
			size: null,
			showInLegend: !1,
			slicedOffset: 10,
			stickyTracking: !1,
			tooltip: {
				followPointer: !0
			},
			borderColor: "#ffffff",
			borderWidth: 1,
			states: {
				hover: {
					brightness: .1,
					shadow: !1
				}
			}
		}, {
			isCartesian: !1,
			requireSorting: !1,
			directTouch: !0,
			noSharedTooltip: !0,
			trackerGroups: ["group", "dataLabelsGroup"],
			axisTypes: [],
			pointAttribs: a.seriesTypes.column.prototype.pointAttribs,
			animate: function(a) {
				var d = this,
					b = d.points,
					e = d.startAngleRad;
				a || (F(b, function(a) {
					var b = a.graphic,
						f = a.shapeArgs;
					b && (b.attr({
						r: a.startR || d.center[3] / 2,
						start: e,
						end: e
					}), b.animate({
						r: f.r,
						start: f.start,
						end: f.end
					}, d.options.animation))
				}), d.animate = null)
			},
			updateTotals: function() {
				var a, f = 0,
					b = this.points,
					e = b.length,
					g,
					l = this.options.ignoreHiddenPoint;
				for(a = 0; a < e; a++) g = b[a], f += l && !g.visible ? 0 : g.isNull ? 0 : g.y;
				this.total = f;
				for(a = 0; a < e; a++) g = b[a], g.percentage = 0 < f && (g.visible || !l) ? g.y / f * 100 : 0, g.total = f
			},
			generatePoints: function() {
				u.prototype.generatePoints.call(this);
				this.updateTotals()
			},
			translate: function(a) {
				this.generatePoints();
				var d = 0,
					b = this.options,
					e = b.slicedOffset,
					f = e + (b.borderWidth || 0),
					g, n, m, r = b.startAngle || 0,
					c = this.startAngleRad = Math.PI / 180 * (r - 90),
					r = (this.endAngleRad = Math.PI / 180 * (l(b.endAngle, r + 360) - 90)) - c,
					t =
					this.points,
					q, B = b.dataLabels.distance,
					b = b.ignoreHiddenPoint,
					u, p = t.length,
					z;
				a || (this.center = a = this.getCenter());
				this.getX = function(b, c, e) {
					m = Math.asin(Math.min((b - a[1]) / (a[2] / 2 + e.labelDistance), 1));
					return a[0] + (c ? -1 : 1) * Math.cos(m) * (a[2] / 2 + e.labelDistance)
				};
				for(u = 0; u < p; u++) {
					z = t[u];
					z.labelDistance = l(z.options.dataLabels && z.options.dataLabels.distance, B);
					this.maxLabelDistance = Math.max(this.maxLabelDistance || 0, z.labelDistance);
					g = c + d * r;
					if(!b || z.visible) d += z.percentage / 100;
					n = c + d * r;
					z.shapeType = "arc";
					z.shapeArgs = {
						x: a[0],
						y: a[1],
						r: a[2] / 2,
						innerR: a[3] / 2,
						start: Math.round(1E3 * g) / 1E3,
						end: Math.round(1E3 * n) / 1E3
					};
					m = (n + g) / 2;
					m > 1.5 * Math.PI ? m -= 2 * Math.PI : m < -Math.PI / 2 && (m += 2 * Math.PI);
					z.slicedTranslation = {
						translateX: Math.round(Math.cos(m) * e),
						translateY: Math.round(Math.sin(m) * e)
					};
					n = Math.cos(m) * a[2] / 2;
					q = Math.sin(m) * a[2] / 2;
					z.tooltipPos = [a[0] + .7 * n, a[1] + .7 * q];
					z.half = m < -Math.PI / 2 || m > Math.PI / 2 ? 1 : 0;
					z.angle = m;
					g = Math.min(f, z.labelDistance / 5);
					z.labelPos = [a[0] + n + Math.cos(m) * z.labelDistance, a[1] + q + Math.sin(m) * z.labelDistance, a[0] + n + Math.cos(m) *
						g, a[1] + q + Math.sin(m) * g, a[0] + n, a[1] + q, 0 > z.labelDistance ? "center" : z.half ? "right" : "left", m
					]
				}
			},
			drawGraph: null,
			drawPoints: function() {
				var a = this,
					f = a.chart.renderer,
					b, e, g, l, n = a.options.shadow;
				n && !a.shadowGroup && (a.shadowGroup = f.g("shadow").add(a.group));
				F(a.points, function(d) {
					if(!d.isNull) {
						e = d.graphic;
						l = d.shapeArgs;
						b = d.getTranslate();
						var k = d.shadowGroup;
						n && !k && (k = d.shadowGroup = f.g("shadow").add(a.shadowGroup));
						k && k.attr(b);
						g = a.pointAttribs(d, d.selected && "select");
						e ? e.setRadialReference(a.center).attr(g).animate(E(l,
							b)) : (d.graphic = e = f[d.shapeType](l).setRadialReference(a.center).attr(b).add(a.group), d.visible || e.attr({
							visibility: "hidden"
						}), e.attr(g).attr({
							"stroke-linejoin": "round"
						}).shadow(n, k));
						e.addClass(d.getClassName())
					}
				})
			},
			searchPoint: f,
			sortByAngle: function(a, f) {
				a.sort(function(a, e) {
					return void 0 !== a.angle && (e.angle - a.angle) * f
				})
			},
			drawLegendSymbol: a.LegendSymbolMixin.drawRectangle,
			getCenter: a.CenteredSeriesMixin.getCenter,
			getSymbol: f
		}, {
			init: function() {
				r.prototype.init.apply(this, arguments);
				var a = this,
					f;
				a.name =
					l(a.name, "Slice");
				f = function(b) {
					a.slice("select" === b.type)
				};
				C(a, "select", f);
				C(a, "unselect", f);
				return a
			},
			isValid: function() {
				return a.isNumber(this.y, !0) && 0 <= this.y
			},
			setVisible: function(a, f) {
				var b = this,
					e = b.series,
					d = e.chart,
					g = e.options.ignoreHiddenPoint;
				f = l(f, g);
				a !== b.visible && (b.visible = b.options.visible = a = void 0 === a ? !b.visible : a, e.options.data[m(b, e.data)] = b.options, F(["graphic", "dataLabel", "connector", "shadowGroup"], function(e) {
					if(b[e]) b[e][a ? "show" : "hide"](!0)
				}), b.legendItem && d.legend.colorizeItem(b,
					a), a || "hover" !== b.state || b.setState(""), g && (e.isDirty = !0), f && d.redraw())
			},
			slice: function(a, f, b) {
				var e = this.series;
				g(b, e.chart);
				l(f, !0);
				this.sliced = this.options.sliced = A(a) ? a : !this.sliced;
				e.options.data[m(this, e.data)] = this.options;
				this.graphic.animate(this.getTranslate());
				this.shadowGroup && this.shadowGroup.animate(this.getTranslate())
			},
			getTranslate: function() {
				return this.sliced ? this.slicedTranslation : {
					translateX: 0,
					translateY: 0
				}
			},
			haloPath: function(a) {
				var d = this.shapeArgs;
				return this.sliced || !this.visible ? [] : this.series.chart.renderer.symbols.arc(d.x, d.y, d.r + a, d.r + a, {
					innerR: this.shapeArgs.r,
					start: d.start,
					end: d.end
				})
			}
		})
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.arrayMax,
			F = a.defined,
			E = a.each,
			m = a.extend,
			f = a.format,
			l = a.map,
			r = a.merge,
			u = a.noop,
			t = a.pick,
			g = a.relativeLength,
			d = a.Series,
			k = a.seriesTypes,
			b = a.stableSort;
		a.distribute = function(a, d) {
			function e(a, b) {
				return a.target - b.target
			}
			var f, g = !0,
				k = a,
				c = [],
				m;
			m = 0;
			for(f = a.length; f--;) m += a[f].size;
			if(m > d) {
				b(a, function(a, b) {
					return(b.rank || 0) - (a.rank || 0)
				});
				for(m = f = 0; m <=
					d;) m += a[f].size, f++;
				c = a.splice(f - 1, a.length)
			}
			b(a, e);
			for(a = l(a, function(a) {
					return {
						size: a.size,
						targets: [a.target]
					}
				}); g;) {
				for(f = a.length; f--;) g = a[f], m = (Math.min.apply(0, g.targets) + Math.max.apply(0, g.targets)) / 2, g.pos = Math.min(Math.max(0, m - g.size / 2), d - g.size);
				f = a.length;
				for(g = !1; f--;) 0 < f && a[f - 1].pos + a[f - 1].size > a[f].pos && (a[f - 1].size += a[f].size, a[f - 1].targets = a[f - 1].targets.concat(a[f].targets), a[f - 1].pos + a[f - 1].size > d && (a[f - 1].pos = d - a[f - 1].size), a.splice(f, 1), g = !0)
			}
			f = 0;
			E(a, function(a) {
				var b = 0;
				E(a.targets,
					function() {
						k[f].pos = a.pos + b;
						b += k[f].size;
						f++
					})
			});
			k.push.apply(k, c);
			b(k, e)
		};
		d.prototype.drawDataLabels = function() {
			var b = this,
				d = b.options,
				g = d.dataLabels,
				k = b.points,
				l, m, c = b.hasRendered || 0,
				u, q, B = t(g.defer, !!d.animation),
				A = b.chart.renderer;
			if(g.enabled || b._hasPointLabels) b.dlProcessOptions && b.dlProcessOptions(g), q = b.plotGroup("dataLabelsGroup", "data-labels", B && !c ? "hidden" : "visible", g.zIndex || 6), B && (q.attr({
				opacity: +c
			}), c || C(b, "afterAnimate", function() {
				b.visible && q.show(!0);
				q[d.animation ? "animate" : "attr"]({
					opacity: 1
				}, {
					duration: 200
				})
			})), m = g, E(k, function(c) {
				var e, k = c.dataLabel,
					n, h, p = c.connector,
					v = !k,
					B;
				l = c.dlOptions || c.options && c.options.dataLabels;
				if(e = t(l && l.enabled, m.enabled) && null !== c.y) g = r(m, l), n = c.getLabelConfig(), u = g.format ? f(g.format, n) : g.formatter.call(n, g), B = g.style, n = g.rotation, B.color = t(g.color, B.color, b.color, "#000000"), "contrast" === B.color && (c.contrastColor = A.getContrast(c.color || b.color), B.color = g.inside || 0 > t(c.labelDistance, g.distance) || d.stacking ? c.contrastColor : "#000000"), d.cursor && (B.cursor = d.cursor),
					h = {
						fill: g.backgroundColor,
						stroke: g.borderColor,
						"stroke-width": g.borderWidth,
						r: g.borderRadius || 0,
						rotation: n,
						padding: g.padding,
						zIndex: 1
					}, a.objectEach(h, function(a, b) {
						void 0 === a && delete h[b]
					});
				!k || e && F(u) ? e && F(u) && (k ? h.text = u : (k = c.dataLabel = A[n ? "text" : "label"](u, 0, -9999, g.shape, null, null, g.useHTML, null, "data-label"), k.addClass("highcharts-data-label-color-" + c.colorIndex + " " + (g.className || "") + (g.useHTML ? "highcharts-tracker" : ""))), k.attr(h), k.css(B).shadow(g.shadow), k.added || k.add(q), b.alignDataLabel(c,
					k, g, null, v)) : (c.dataLabel = k = k.destroy(), p && (c.connector = p.destroy()))
			})
		};
		d.prototype.alignDataLabel = function(a, b, d, f, g) {
			var e = this.chart,
				c = e.inverted,
				k = t(a.plotX, -9999),
				l = t(a.plotY, -9999),
				n = b.getBBox(),
				r, p = d.rotation,
				v = d.align,
				u = this.visible && (a.series.forceDL || e.isInsidePlot(k, Math.round(l), c) || f && e.isInsidePlot(k, c ? f.x + 1 : f.y + f.height - 1, c)),
				y = "justify" === t(d.overflow, "justify");
			if(u && (r = d.style.fontSize, r = e.renderer.fontMetrics(r, b).b, f = m({
					x: c ? this.yAxis.len - l : k,
					y: Math.round(c ? this.xAxis.len - k : l),
					width: 0,
					height: 0
				}, f), m(d, {
					width: n.width,
					height: n.height
				}), p ? (y = !1, k = e.renderer.rotCorr(r, p), k = {
					x: f.x + d.x + f.width / 2 + k.x,
					y: f.y + d.y + {
						top: 0,
						middle: .5,
						bottom: 1
					}[d.verticalAlign] * f.height
				}, b[g ? "attr" : "animate"](k).attr({
					align: v
				}), l = (p + 720) % 360, l = 180 < l && 360 > l, "left" === v ? k.y -= l ? n.height : 0 : "center" === v ? (k.x -= n.width / 2, k.y -= n.height / 2) : "right" === v && (k.x -= n.width, k.y -= l ? 0 : n.height)) : (b.align(d, null, f), k = b.alignAttr), y ? a.isLabelJustified = this.justifyDataLabel(b, d, k, n, f, g) : t(d.crop, !0) && (u = e.isInsidePlot(k.x,
					k.y) && e.isInsidePlot(k.x + n.width, k.y + n.height)), d.shape && !p)) b[g ? "attr" : "animate"]({
				anchorX: c ? e.plotWidth - a.plotY : a.plotX,
				anchorY: c ? e.plotHeight - a.plotX : a.plotY
			});
			u || (b.attr({
				y: -9999
			}), b.placed = !1)
		};
		d.prototype.justifyDataLabel = function(a, b, d, f, g, k) {
			var c = this.chart,
				e = b.align,
				l = b.verticalAlign,
				m, n, p = a.box ? 0 : a.padding || 0;
			m = d.x + p;
			0 > m && ("right" === e ? b.align = "left" : b.x = -m, n = !0);
			m = d.x + f.width - p;
			m > c.plotWidth && ("left" === e ? b.align = "right" : b.x = c.plotWidth - m, n = !0);
			m = d.y + p;
			0 > m && ("bottom" === l ? b.verticalAlign =
				"top" : b.y = -m, n = !0);
			m = d.y + f.height - p;
			m > c.plotHeight && ("top" === l ? b.verticalAlign = "bottom" : b.y = c.plotHeight - m, n = !0);
			n && (a.placed = !k, a.align(b, null, g));
			return n
		};
		k.pie && (k.pie.prototype.drawDataLabels = function() {
				var b = this,
					f = b.data,
					g, k = b.chart,
					l = b.options.dataLabels,
					m = t(l.connectorPadding, 10),
					c = t(l.connectorWidth, 1),
					r = k.plotWidth,
					q = k.plotHeight,
					u, C = b.center,
					p = C[2] / 2,
					z = C[1],
					I, L, h, w, M = [
						[],
						[]
					],
					H, O, Q, R, x = [0, 0, 0, 0];
				b.visible && (l.enabled || b._hasPointLabels) && (E(f, function(a) {
					a.dataLabel && a.visible && a.dataLabel.shortened &&
						(a.dataLabel.attr({
							width: "auto"
						}).css({
							width: "auto",
							textOverflow: "clip"
						}), a.dataLabel.shortened = !1)
				}), d.prototype.drawDataLabels.apply(b), E(f, function(a) {
					a.dataLabel && a.visible && (M[a.half].push(a), a.dataLabel._pos = null)
				}), E(M, function(c, d) {
					var e, f, n = c.length,
						v = [],
						u;
					if(n)
						for(b.sortByAngle(c, d - .5), 0 < b.maxLabelDistance && (e = Math.max(0, z - p - b.maxLabelDistance), f = Math.min(z + p + b.maxLabelDistance, k.plotHeight), E(c, function(a) {
								0 < a.labelDistance && a.dataLabel && (a.top = Math.max(0, z - p - a.labelDistance), a.bottom =
									Math.min(z + p + a.labelDistance, k.plotHeight), u = a.dataLabel.getBBox().height || 21, a.positionsIndex = v.push({
										target: a.labelPos[1] - a.top + u / 2,
										size: u,
										rank: a.y
									}) - 1)
							}), a.distribute(v, f + u - e)), R = 0; R < n; R++) g = c[R], f = g.positionsIndex, h = g.labelPos, I = g.dataLabel, Q = !1 === g.visible ? "hidden" : "inherit", e = h[1], v && F(v[f]) ? void 0 === v[f].pos ? Q = "hidden" : (w = v[f].size, O = g.top + v[f].pos) : O = e, delete g.positionIndex, H = l.justify ? C[0] + (d ? -1 : 1) * (p + g.labelDistance) : b.getX(O < g.top + 2 || O > g.bottom - 2 ? e : O, d, g), I._attr = {
								visibility: Q,
								align: h[6]
							},
							I._pos = {
								x: H + l.x + ({
									left: m,
									right: -m
								}[h[6]] || 0),
								y: O + l.y - 10
							}, h.x = H, h.y = O, t(l.crop, !0) && (L = I.getBBox().width, e = null, H - L < m ? (e = Math.round(L - H + m), x[3] = Math.max(e, x[3])) : H + L > r - m && (e = Math.round(H + L - r + m), x[1] = Math.max(e, x[1])), 0 > O - w / 2 ? x[0] = Math.max(Math.round(-O + w / 2), x[0]) : O + w / 2 > q && (x[2] = Math.max(Math.round(O + w / 2 - q), x[2])), I.sideOverflow = e)
				}), 0 === A(x) || this.verifyDataLabelOverflow(x)) && (this.placeDataLabels(), c && E(this.points, function(a) {
					var e;
					u = a.connector;
					if((I = a.dataLabel) && I._pos && a.visible && 0 < a.labelDistance) {
						Q =
							I._attr.visibility;
						if(e = !u) a.connector = u = k.renderer.path().addClass("highcharts-data-label-connector highcharts-color-" + a.colorIndex).add(b.dataLabelsGroup), u.attr({
							"stroke-width": c,
							stroke: l.connectorColor || a.color || "#666666"
						});
						u[e ? "attr" : "animate"]({
							d: b.connectorPath(a.labelPos)
						});
						u.attr("visibility", Q)
					} else u && (a.connector = u.destroy())
				}))
			}, k.pie.prototype.connectorPath = function(a) {
				var b = a.x,
					d = a.y;
				return t(this.options.dataLabels.softConnector, !0) ? ["M", b + ("left" === a[6] ? 5 : -5), d, "C", b, d, 2 * a[2] - a[4],
					2 * a[3] - a[5], a[2], a[3], "L", a[4], a[5]
				] : ["M", b + ("left" === a[6] ? 5 : -5), d, "L", a[2], a[3], "L", a[4], a[5]]
			}, k.pie.prototype.placeDataLabels = function() {
				E(this.points, function(a) {
					var b = a.dataLabel;
					b && a.visible && ((a = b._pos) ? (b.sideOverflow && (b._attr.width = b.getBBox().width - b.sideOverflow, b.css({
						width: b._attr.width + "px",
						textOverflow: "ellipsis"
					}), b.shortened = !0), b.attr(b._attr), b[b.moved ? "animate" : "attr"](a), b.moved = !0) : b && b.attr({
						y: -9999
					}))
				}, this)
			}, k.pie.prototype.alignDataLabel = u, k.pie.prototype.verifyDataLabelOverflow =
			function(a) {
				var b = this.center,
					d = this.options,
					e = d.center,
					f = d.minSize || 80,
					k, c = null !== d.size;
				c || (null !== e[0] ? k = Math.max(b[2] - Math.max(a[1], a[3]), f) : (k = Math.max(b[2] - a[1] - a[3], f), b[0] += (a[3] - a[1]) / 2), null !== e[1] ? k = Math.max(Math.min(k, b[2] - Math.max(a[0], a[2])), f) : (k = Math.max(Math.min(k, b[2] - a[0] - a[2]), f), b[1] += (a[0] - a[2]) / 2), k < b[2] ? (b[2] = k, b[3] = Math.min(g(d.innerSize || 0, k), k), this.translate(b), this.drawDataLabels && this.drawDataLabels()) : c = !0);
				return c
			});
		k.column && (k.column.prototype.alignDataLabel = function(a,
			b, f, g, k) {
			var e = this.chart.inverted,
				c = a.series,
				l = a.dlBox || a.shapeArgs,
				m = t(a.below, a.plotY > t(this.translatedThreshold, c.yAxis.len)),
				n = t(f.inside, !!this.options.stacking);
			l && (g = r(l), 0 > g.y && (g.height += g.y, g.y = 0), l = g.y + g.height - c.yAxis.len, 0 < l && (g.height -= l), e && (g = {
				x: c.yAxis.len - g.y - g.height,
				y: c.xAxis.len - g.x - g.width,
				width: g.height,
				height: g.width
			}), n || (e ? (g.x += m ? 0 : g.width, g.width = 0) : (g.y += m ? g.height : 0, g.height = 0)));
			f.align = t(f.align, !e || n ? "center" : m ? "right" : "left");
			f.verticalAlign = t(f.verticalAlign, e ||
				n ? "middle" : m ? "top" : "bottom");
			d.prototype.alignDataLabel.call(this, a, b, f, g, k);
			a.isLabelJustified && a.contrastColor && a.dataLabel.css({
				color: a.contrastColor
			})
		})
	})(M);
	(function(a) {
		var C = a.Chart,
			A = a.each,
			F = a.objectEach,
			E = a.pick,
			m = a.addEvent;
		C.prototype.callbacks.push(function(a) {
			function f() {
				var f = [];
				A(a.yAxis || [], function(a) {
					a.options.stackLabels && !a.options.stackLabels.allowOverlap && F(a.stacks, function(a) {
						F(a, function(a) {
							f.push(a.label)
						})
					})
				});
				A(a.series || [], function(a) {
					var l = a.options.dataLabels,
						g = a.dataLabelCollections || ["dataLabel"];
					(l.enabled || a._hasPointLabels) && !l.allowOverlap && a.visible && A(g, function(d) {
						A(a.points, function(a) {
							a[d] && (a[d].labelrank = E(a.labelrank, a.shapeArgs && a.shapeArgs.height), f.push(a[d]))
						})
					})
				});
				a.hideOverlappingLabels(f)
			}
			f();
			m(a, "redraw", f)
		});
		C.prototype.hideOverlappingLabels = function(a) {
			var f = a.length,
				m, u, t, g, d, k, b, e, v, y = function(a, b, d, c, e, f, g, k) {
					return !(e > a + d || e + g < a || f > b + c || f + k < b)
				};
			for(u = 0; u < f; u++)
				if(m = a[u]) m.oldOpacity = m.opacity, m.newOpacity = 1, m.width || (t = m.getBBox(), m.width = t.width, m.height =
					t.height);
			a.sort(function(a, b) {
				return(b.labelrank || 0) - (a.labelrank || 0)
			});
			for(u = 0; u < f; u++)
				for(t = a[u], m = u + 1; m < f; ++m)
					if(g = a[m], t && g && t !== g && t.placed && g.placed && 0 !== t.newOpacity && 0 !== g.newOpacity && (d = t.alignAttr, k = g.alignAttr, b = t.parentGroup, e = g.parentGroup, v = 2 * (t.box ? 0 : t.padding || 0), d = y(d.x + b.translateX, d.y + b.translateY, t.width - v, t.height - v, k.x + e.translateX, k.y + e.translateY, g.width - v, g.height - v)))(t.labelrank < g.labelrank ? t : g).newOpacity = 0;
			A(a, function(a) {
				var b, d;
				a && (d = a.newOpacity, a.oldOpacity !== d &&
					a.placed && (d ? a.show(!0) : b = function() {
						a.hide()
					}, a.alignAttr.opacity = d, a[a.isOld ? "animate" : "attr"](a.alignAttr, null, b)), a.isOld = !0)
			})
		}
	})(M);
	(function(a) {
		var C = a.addEvent,
			A = a.Chart,
			F = a.createElement,
			E = a.css,
			m = a.defaultOptions,
			f = a.defaultPlotOptions,
			l = a.each,
			r = a.extend,
			u = a.fireEvent,
			t = a.hasTouch,
			g = a.inArray,
			d = a.isObject,
			k = a.Legend,
			b = a.merge,
			e = a.pick,
			v = a.Point,
			y = a.Series,
			n = a.seriesTypes,
			D = a.svg,
			J;
		J = a.TrackerMixin = {
			drawTrackerPoint: function() {
				var a = this,
					b = a.chart.pointer,
					d = function(a) {
						var c = b.getPointFromEvent(a);
						void 0 !== c && (b.isDirectTouch = !0, c.onMouseOver(a))
					};
				l(a.points, function(a) {
					a.graphic && (a.graphic.element.point = a);
					a.dataLabel && (a.dataLabel.div ? a.dataLabel.div.point = a : a.dataLabel.element.point = a)
				});
				a._hasTracking || (l(a.trackerGroups, function(c) {
					if(a[c]) {
						a[c].addClass("highcharts-tracker").on("mouseover", d).on("mouseout", function(a) {
							b.onTrackerMouseOut(a)
						});
						if(t) a[c].on("touchstart", d);
						a.options.cursor && a[c].css(E).css({
							cursor: a.options.cursor
						})
					}
				}), a._hasTracking = !0)
			},
			drawTrackerGraph: function() {
				var a =
					this,
					b = a.options,
					d = b.trackByArea,
					e = [].concat(d ? a.areaPath : a.graphPath),
					f = e.length,
					g = a.chart,
					k = g.pointer,
					m = g.renderer,
					n = g.options.tooltip.snap,
					h = a.tracker,
					r, u = function() {
						if(g.hoverSeries !== a) a.onMouseOver()
					},
					v = "rgba(192,192,192," + (D ? .0001 : .002) + ")";
				if(f && !d)
					for(r = f + 1; r--;) "M" === e[r] && e.splice(r + 1, 0, e[r + 1] - n, e[r + 2], "L"), (r && "M" === e[r] || r === f) && e.splice(r, 0, "L", e[r - 2] + n, e[r - 1]);
				h ? h.attr({
					d: e
				}) : a.graph && (a.tracker = m.path(e).attr({
					"stroke-linejoin": "round",
					visibility: a.visible ? "visible" : "hidden",
					stroke: v,
					fill: d ? v : "none",
					"stroke-width": a.graph.strokeWidth() + (d ? 0 : 2 * n),
					zIndex: 2
				}).add(a.group), l([a.tracker, a.markerGroup], function(a) {
					a.addClass("highcharts-tracker").on("mouseover", u).on("mouseout", function(a) {
						k.onTrackerMouseOut(a)
					});
					b.cursor && a.css({
						cursor: b.cursor
					});
					if(t) a.on("touchstart", u)
				}))
			}
		};
		n.column && (n.column.prototype.drawTracker = J.drawTrackerPoint);
		n.pie && (n.pie.prototype.drawTracker = J.drawTrackerPoint);
		n.scatter && (n.scatter.prototype.drawTracker = J.drawTrackerPoint);
		r(k.prototype, {
			setItemEvents: function(a,
				d, e) {
				var c = this,
					f = c.chart.renderer.boxWrapper,
					g = "highcharts-legend-" + (a.series ? "point" : "series") + "-active";
				(e ? d : a.legendGroup).on("mouseover", function() {
					a.setState("hover");
					f.addClass(g);
					d.css(c.options.itemHoverStyle)
				}).on("mouseout", function() {
					d.css(b(a.visible ? c.itemStyle : c.itemHiddenStyle));
					f.removeClass(g);
					a.setState()
				}).on("click", function(b) {
					var c = function() {
						a.setVisible && a.setVisible()
					};
					b = {
						browserEvent: b
					};
					a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : u(a, "legendItemClick", b, c)
				})
			},
			createCheckboxForItem: function(a) {
				a.checkbox = F("input", {
					type: "checkbox",
					checked: a.selected,
					defaultChecked: a.selected
				}, this.options.itemCheckboxStyle, this.chart.container);
				C(a.checkbox, "click", function(b) {
					u(a.series || a, "checkboxClick", {
						checked: b.target.checked,
						item: a
					}, function() {
						a.select()
					})
				})
			}
		});
		m.legend.itemStyle.cursor = "pointer";
		r(A.prototype, {
			showResetZoom: function() {
				var a = this,
					b = m.lang,
					d = a.options.chart.resetZoomButton,
					e = d.theme,
					f = e.states,
					g = "chart" === d.relativeTo ? null : "plotBox";
				this.resetZoomButton =
					a.renderer.button(b.resetZoom, null, null, function() {
						a.zoomOut()
					}, e, f && f.hover).attr({
						align: d.position.align,
						title: b.resetZoomTitle
					}).addClass("highcharts-reset-zoom").add().align(d.position, !1, g)
			},
			zoomOut: function() {
				var a = this;
				u(a, "selection", {
					resetSelection: !0
				}, function() {
					a.zoom()
				})
			},
			zoom: function(a) {
				var b, c = this.pointer,
					f = !1,
					g;
				!a || a.resetSelection ? (l(this.axes, function(a) {
					b = a.zoom()
				}), c.initiated = !1) : l(a.xAxis.concat(a.yAxis), function(a) {
					var d = a.axis;
					c[d.isXAxis ? "zoomX" : "zoomY"] && (b = d.zoom(a.min,
						a.max), d.displayBtn && (f = !0))
				});
				g = this.resetZoomButton;
				f && !g ? this.showResetZoom() : !f && d(g) && (this.resetZoomButton = g.destroy());
				b && this.redraw(e(this.options.chart.animation, a && a.animation, 100 > this.pointCount))
			},
			pan: function(a, b) {
				var c = this,
					d = c.hoverPoints,
					e;
				d && l(d, function(a) {
					a.setState()
				});
				l("xy" === b ? [1, 0] : [1], function(b) {
					b = c[b ? "xAxis" : "yAxis"][0];
					var d = b.horiz,
						f = a[d ? "chartX" : "chartY"],
						d = d ? "mouseDownX" : "mouseDownY",
						g = c[d],
						h = (b.pointRange || 0) / 2,
						k = b.getExtremes(),
						l = b.toValue(g - f, !0) + h,
						h = b.toValue(g +
							b.len - f, !0) - h,
						m = h < l,
						g = m ? h : l,
						l = m ? l : h,
						h = Math.min(k.dataMin, b.toValue(b.toPixels(k.min) - b.minPixelPadding)),
						m = Math.max(k.dataMax, b.toValue(b.toPixels(k.max) + b.minPixelPadding)),
						n;
					n = h - g;
					0 < n && (l += n, g = h);
					n = l - m;
					0 < n && (l = m, g -= n);
					b.series.length && g !== k.min && l !== k.max && (b.setExtremes(g, l, !1, !1, {
						trigger: "pan"
					}), e = !0);
					c[d] = f
				});
				e && c.redraw(!1);
				E(c.container, {
					cursor: "move"
				})
			}
		});
		r(v.prototype, {
			select: function(a, b) {
				var c = this,
					d = c.series,
					f = d.chart;
				a = e(a, !c.selected);
				c.firePointEvent(a ? "select" : "unselect", {
						accumulate: b
					},
					function() {
						c.selected = c.options.selected = a;
						d.options.data[g(c, d.data)] = c.options;
						c.setState(a && "select");
						b || l(f.getSelectedPoints(), function(a) {
							a.selected && a !== c && (a.selected = a.options.selected = !1, d.options.data[g(a, d.data)] = a.options, a.setState(""), a.firePointEvent("unselect"))
						})
					})
			},
			onMouseOver: function(a) {
				var b = this.series.chart,
					c = b.pointer;
				a = a ? c.normalize(a) : c.getChartCoordinatesFromPoint(this, b.inverted);
				c.runPointActions(a, this)
			},
			onMouseOut: function() {
				var a = this.series.chart;
				this.firePointEvent("mouseOut");
				l(a.hoverPoints || [], function(a) {
					a.setState()
				});
				a.hoverPoints = a.hoverPoint = null
			},
			importEvents: function() {
				if(!this.hasImportedEvents) {
					var c = this,
						d = b(c.series.options.point, c.options).events;
					c.events = d;
					a.objectEach(d, function(a, b) {
						C(c, b, a)
					});
					this.hasImportedEvents = !0
				}
			},
			setState: function(a, b) {
				var c = Math.floor(this.plotX),
					d = this.plotY,
					g = this.series,
					k = g.options.states[a] || {},
					l = f[g.type].marker && g.options.marker,
					m = l && !1 === l.enabled,
					n = l && l.states && l.states[a] || {},
					h = !1 === n.enabled,
					t = g.stateMarkerGraphic,
					u =
					this.marker || {},
					v = g.chart,
					y = g.halo,
					A, C = l && g.markerAttribs;
				a = a || "";
				if(!(a === this.state && !b || this.selected && "select" !== a || !1 === k.enabled || a && (h || m && !1 === n.enabled) || a && u.states && u.states[a] && !1 === u.states[a].enabled)) {
					C && (A = g.markerAttribs(this, a));
					if(this.graphic) this.state && this.graphic.removeClass("highcharts-point-" + this.state), a && this.graphic.addClass("highcharts-point-" + a), this.graphic.animate(g.pointAttribs(this, a), e(v.options.chart.animation, k.animation)), A && this.graphic.animate(A, e(v.options.chart.animation,
						n.animation, l.animation)), t && t.hide();
					else {
						if(a && n) {
							l = u.symbol || g.symbol;
							t && t.currentSymbol !== l && (t = t.destroy());
							if(t) t[b ? "animate" : "attr"]({
								x: A.x,
								y: A.y
							});
							else l && (g.stateMarkerGraphic = t = v.renderer.symbol(l, A.x, A.y, A.width, A.height).add(g.markerGroup), t.currentSymbol = l);
							t && t.attr(g.pointAttribs(this, a))
						}
						t && (t[a && v.isInsidePlot(c, d, v.inverted) ? "show" : "hide"](), t.element.point = this)
					}(c = k.halo) && c.size ? (y || (g.halo = y = v.renderer.path().add((this.graphic || t).parentGroup)), y[b ? "animate" : "attr"]({
							d: this.haloPath(c.size)
						}),
						y.attr({
							"class": "highcharts-halo highcharts-color-" + e(this.colorIndex, g.colorIndex)
						}), y.point = this, y.attr(r({
							fill: this.color || g.color,
							"fill-opacity": c.opacity,
							zIndex: -1
						}, c.attributes))) : y && y.point && y.point.haloPath && y.animate({
						d: y.point.haloPath(0)
					});
					this.state = a
				}
			},
			haloPath: function(a) {
				return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX) - a, this.plotY - a, 2 * a, 2 * a)
			}
		});
		r(y.prototype, {
			onMouseOver: function() {
				var a = this.chart,
					b = a.hoverSeries;
				if(b && b !== this) b.onMouseOut();
				this.options.events.mouseOver &&
					u(this, "mouseOver");
				this.setState("hover");
				a.hoverSeries = this
			},
			onMouseOut: function() {
				var a = this.options,
					b = this.chart,
					d = b.tooltip,
					e = b.hoverPoint;
				b.hoverSeries = null;
				if(e) e.onMouseOut();
				this && a.events.mouseOut && u(this, "mouseOut");
				!d || this.stickyTracking || d.shared && !this.noSharedTooltip || d.hide();
				this.setState()
			},
			setState: function(a) {
				var b = this,
					c = b.options,
					d = b.graph,
					f = c.states,
					g = c.lineWidth,
					c = 0;
				a = a || "";
				if(b.state !== a && (l([b.group, b.markerGroup, b.dataLabelsGroup], function(c) {
						c && (b.state && c.removeClass("highcharts-series-" +
							b.state), a && c.addClass("highcharts-series-" + a))
					}), b.state = a, !f[a] || !1 !== f[a].enabled) && (a && (g = f[a].lineWidth || g + (f[a].lineWidthPlus || 0)), d && !d.dashstyle))
					for(g = {
							"stroke-width": g
						}, d.animate(g, e(b.chart.options.chart.animation, f[a] && f[a].animation)); b["zone-graph-" + c];) b["zone-graph-" + c].attr(g), c += 1
			},
			setVisible: function(a, b) {
				var c = this,
					d = c.chart,
					e = c.legendItem,
					f, g = d.options.chart.ignoreHiddenSeries,
					k = c.visible;
				f = (c.visible = a = c.options.visible = c.userOptions.visible = void 0 === a ? !k : a) ? "show" : "hide";
				l(["group",
					"dataLabelsGroup", "markerGroup", "tracker", "tt"
				], function(a) {
					if(c[a]) c[a][f]()
				});
				if(d.hoverSeries === c || (d.hoverPoint && d.hoverPoint.series) === c) c.onMouseOut();
				e && d.legend.colorizeItem(c, a);
				c.isDirty = !0;
				c.options.stacking && l(d.series, function(a) {
					a.options.stacking && a.visible && (a.isDirty = !0)
				});
				l(c.linkedSeries, function(b) {
					b.setVisible(a, !1)
				});
				g && (d.isDirtyBox = !0);
				!1 !== b && d.redraw();
				u(c, f)
			},
			show: function() {
				this.setVisible(!0)
			},
			hide: function() {
				this.setVisible(!1)
			},
			select: function(a) {
				this.selected = a = void 0 ===
					a ? !this.selected : a;
				this.checkbox && (this.checkbox.checked = a);
				u(this, a ? "select" : "unselect")
			},
			drawTracker: J.drawTrackerGraph
		})
	})(M);
	(function(a) {
		var C = a.Chart,
			A = a.each,
			F = a.inArray,
			E = a.isArray,
			m = a.isObject,
			f = a.pick,
			l = a.splat;
		C.prototype.setResponsive = function(f) {
			var l = this.options.responsive,
				m = [],
				g = this.currentResponsive;
			l && l.rules && A(l.rules, function(d) {
				void 0 === d._id && (d._id = a.uniqueKey());
				this.matchResponsiveRule(d, m, f)
			}, this);
			var d = a.merge.apply(0, a.map(m, function(d) {
					return a.find(l.rules, function(a) {
						return a._id ===
							d
					}).chartOptions
				})),
				m = m.toString() || void 0;
			m !== (g && g.ruleIds) && (g && this.update(g.undoOptions, f), m ? (this.currentResponsive = {
				ruleIds: m,
				mergedOptions: d,
				undoOptions: this.currentOptions(d)
			}, this.update(d, f)) : this.currentResponsive = void 0)
		};
		C.prototype.matchResponsiveRule = function(a, l) {
			var m = a.condition;
			(m.callback || function() {
				return this.chartWidth <= f(m.maxWidth, Number.MAX_VALUE) && this.chartHeight <= f(m.maxHeight, Number.MAX_VALUE) && this.chartWidth >= f(m.minWidth, 0) && this.chartHeight >= f(m.minHeight, 0)
			}).call(this) &&
				l.push(a._id)
		};
		C.prototype.currentOptions = function(f) {
			function r(f, d, k, b) {
				var e;
				a.objectEach(f, function(a, g) {
					if(!b && -1 < F(g, ["series", "xAxis", "yAxis"]))
						for(f[g] = l(f[g]), k[g] = [], e = 0; e < f[g].length; e++) d[g][e] && (k[g][e] = {}, r(a[e], d[g][e], k[g][e], b + 1));
					else m(a) ? (k[g] = E(a) ? [] : {}, r(a, d[g] || {}, k[g], b + 1)) : k[g] = d[g] || null
				})
			}
			var t = {};
			r(f, this.options, t, 0);
			return t
		}
	})(M);
	return M
});